0

1 を返す ReportVersion() という 1 つの関数を使用して、Visual Studio で簡単な C++ DLL を作成しました。

int _stdcall ReportVersion() {
    return 1;
}

次に、この DLL を呼び出す VB.net EXE を作成しました。

Public Class Form1

    Private Declare Function ReportVersion Lib "Test_DLL.dll" () As Long

    Private Sub btnVersion_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnVersion.Click
        Call MsgBox(ReportVersion())
    End Sub
End Class

F5 キーを押してリリース/デバッグ モードで実行すると、ReportVersion の戻り値は 6824607285638070273 です。

ソリューションをビルドして .EXE を手動で実行すると、戻り値は 1 になります (予想どおり)。

一体どこから 6824607285638070273 を得ているのでしょうか?

参考までに、これら2つの記事を例として作成しました

http://edais.mvps.org/Tutorials/CDLL/CDLLch1b.html

http://edais.mvps.org/Tutorials/CDLL/CDLLch2.html

異なる言語で記述された DLL/アプリケーション間の呼び出しを行ったことがないためです。

4

1 に答える 1

0

リンクされた記事の元の著者にメールを送信したところ、そのような古い記事について返信があり、うれしい驚きでした。これは問題を理解するのに役立ちました。

VB6 では、"Integer" 型は符号付き 16 ビット整数で、"Long" 型は符号付き 32 ビット整数でした。

VB.NET では、"Integer" 型は符号付き 32 ビット整数で、"Long" 型は 64 ビット符号付き整数です。16 ビットの符号付き整数の役割を満たすために、「Short」タイプも追加されました。

実際、上記の ReportVersion() によって返された値を変換すると、0x5EB5E02B00000001 になることがわかります。ご覧のとおり、下位 8 桁 (0x00000001) には正しい値が含まれていますが、上位桁には、その時点でたまたま隣のメモリにあったデータが含まれています。

IDE 内ではなく、実行可能ファイルとして実行することの不一致については、おそらくそのメモリ領域がアプリケーションの実行前にクリアされていると想像できるので、実際には 0x0000000000000001 が返され、1 として正しく評価されます。

于 2012-06-27T11:37:39.430 に答える