C++函数的VB6声明给出了"错误的DLL调用约定"

0 c++ vb6 calling-convention

这个C++函数的VB6声明是什么?

LPCWSTR* MW_ListReaders(_ULONG Context, int* NumberOfReaders);
Run Code Online (Sandbox Code Playgroud)

以下给了我"糟糕的DLL调用约定":

Private Declare Function ListReaders Lib "MyDLL.dll" (ByVal Context As Long, _
                                                    ByRef NumberOfReaders As Integer) As Long
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 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版本允许您调用此类函数的事实已被确认为Microsoft的错误.您不应该依赖此行为,因为在Visual Basic的未来版本中这可能会更改.