C+的VB6声明+;函数给出;错误的DLL调用约定“; 这个C++函数的正确VB6声明是什么? LPCWSTR*MW\u列表阅读器(\u ULONG Context,int*NumberOfReaders);

C+的VB6声明+;函数给出;错误的DLL调用约定“; 这个C++函数的正确VB6声明是什么? LPCWSTR*MW\u列表阅读器(\u ULONG Context,int*NumberOfReaders);,c++,vb6,calling-convention,C++,Vb6,Calling Convention,下面给出了“错误的DLL调用约定”: 私有声明函数ListReaders Lib“MyDLL.dll”(ByVal上下文长度_ ByRef NumberOfReaders(作为整数)的长度 > p>在C++声明中没有指定调用约定。大多数C/C++编译器默认为\uu cdecl。如果函数实际使用了\uu cdecl,则无法在VB6中调用它: 如果DLL中的C函数使用_cdecl调用约定,则无法直接调用该函数。这是因为Visual Basic使用_stdcall调用约定调用函数。这是一个问题,因

下面给出了“错误的DLL调用约定”:

私有声明函数ListReaders Lib“MyDLL.dll”(ByVal上下文长度_
ByRef NumberOfReaders(作为整数)的长度

> p>在C++声明中没有指定调用约定。大多数C/C++编译器默认为
\uu cdecl
。如果函数实际使用了
\uu cdecl
,则无法在VB6中调用它:

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

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

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

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


除了Remy的回答,您还发现Vb声明有点错误:

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

“Integer”在vb中是一个2字节的整数。

那么_ULONG呢?它是64位吗?否-它在windows.h中定义为32位无符号整数。VB不支持无符号整数,所以你必须用一个有符号的32位整数来伪造它,也就是说,“只要”引用文档中的重要单词是直接的。您可以从VB6调用
cdecl
函数,如果该函数不可用。