VB6 declaration for C++ function gives “Bad DLL calling convention”

廉价感情. 提交于 2019-12-12 04:59:50

问题


What is the correct VB6 declaration for this C++ function?

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

The following gave me "Bad DLL calling convention":

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

回答1:


There is no calling convention specified in that C++ declaration. Most C/C++ compilers default to __cdecl. If the function does actually use __cdecl then you will not be able to call it in VB6:

How To Call C Functions That Use the _cdecl Calling Convention

It is not possible to directly call a C function in a DLL if that function uses the _cdecl calling convention. This is because Visual Basic uses the _stdcall calling convention for calling functions. This is a problem because if _cdecl is used, the calling function is responsible for cleaning up the stack. However, if _stdcall is used, the called function is responsible for cleaning up the stack.

NOTE: An .EXE file created in Visual Basic will allow you to call a DLL function that has been declared with the _cdecl calling convention without an error. It is only when you try to call such a function when running a program from the Visual Basic IDE, that Visual Basic generates the following error:

Run-time Error '49': Bad DLL Calling Convention

The fact that the EXE version allows you to call such functions has been confirmed to be a bug by Microsoft. You should not rely on this behavior as this might change in future versions of Visual Basic.




回答2:


In addition to Remy's answer, you have also got the Vb declaration slightly wrong:

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

"Integer" is a 2 byte integer in vb.



来源:https://stackoverflow.com/questions/16293334/vb6-declaration-for-c-function-gives-bad-dll-calling-convention

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!