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

时间:2013-04-30 06:10:27

标签: c++ vb6 calling-convention

这个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

2 个答案:

答案 0 :(得分:5)

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

How To Call C Functions That Use the _cdecl Calling Convention

  

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

     

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

     

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

     

EXE版本允许您调用此类函数的事实已被确认为Microsoft的错误。您不应该依赖此行为,因为在Visual Basic的未来版本中这可能会更改。

答案 1 :(得分:0)

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

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

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