0

此 C++ 函数的正确 VB6 声明是什么?

LPCWSTR* MW_ListReaders(_ULONG Context, int* NumberOfReaders);

以下给了我“错误的 DLL 调用约定”:

Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, _
                                                    ByRef NumberOfReaders As Integer) As Long
4

2 回答 2

5

该 C++ 声明中没有指定调用约定。大多数 C/C++ 编译器默认为__cdecl. 如果该函数确实使用了__cdecl,那么您将无法在 VB6 中调用它:

如何调用使用 _cdecl 调用约定的 C 函数

如果函数使用 _cdecl 调用约定,则不能直接调用 DLL 中的 C 函数。这是因为 Visual Basic 使用 _stdcall 调用约定来调用函数。这是一个问题,因为如果使用 _cdecl,调用函数负责清理堆栈。但是,如果使用 _stdcall,则被调用函数负责清理堆栈。

注意:在 Visual Basic 中创建的 .EXE 文件将允许您调用已使用 _cdecl 调用约定声明的 DLL 函数而不会出现错误。只有在从 Visual Basic IDE 运行程序时尝试调用此类函数时,Visual Basic 才会生成以下错误:

运行时错误“49”:错误的 DLL 调用约定

EXE版本允许你调用这些函数的事实已经被微软确认是一个错误。您不应依赖此行为,因为这可能会在 Visual Basic 的未来版本中发生变化。

于 2013-04-30T08:19:22.537 回答
0

除了雷米的回答,你也得到了 Vb 声明略有错误:

Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, ByRef NumberOfReaders As Long) As Long

“整数”是 vb 中的 2 字节整数。

于 2013-04-30T16:16:02.983 回答