0

我在 Visual Studio 中编写了一个快速的 C++ DLL,其中有一个名为 ReportVersion() 的函数返回 1。

int _stdcall ReportVersion() {
    return 1;
}

然后我创建了一个 VB.net EXE 来调用这个 DLL。

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 并在任一 Release/Debug 模式下运行,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 位有符号整数角色。

实际上,如果您将上面的 ReportVersion() 提供给您的值转换为 0x5EB5E02B00000001。正如您所看到的,低 8 位数字 (0x00000001) 具有正确的值,而高位数字恰好包含当时恰好在内存中的任何数据。

至于作为可执行文件运行与在 IDE 中运行之间的差异,我只能想象,也许该内存区域在应用程序运行之前被清除,因此它实际上返回 0x0000000000000001,它被正确评估为 1。

于 2012-06-27T11:37:39.430 回答