用VB6调用VC6下编译的DLL中的导出函数,调试运行时会报告“Bad DLL call convention”,而编译成EXE以后直接运行则没有问题。
上网查阅文章后发现,解释方式下的VB调用C语言写的函数,仅限于PASCAL调用约定的函数,也就是stdcall方式,而C方式的函数(cdecl)是不行的,编译运行时无此限制。
解决方法,打开DLL文件源代码,在导出函数的声明和实现前面都加上关键字__stdcall,例如:
// in head file:
int __stdcall myFunction();
// in cpp file:
int __stdcall myFunction () { ... }
重新编译DLL并再次运行VB程序,问题解决。
由此不难理解为什么Windows API函数的声明中为什么都有一个“WINAPI”,例如
int
WINAPI
MessageBoxA(
HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType);
因为在windef.h中有以下定义:
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
本文介绍了使用VB6调用VC6编译的DLL时遇到的“BadDLLcallconvention”错误,并提供了解决方案。通过将DLL中的导出函数调用约定设置为__stdcall可以解决此问题。
970

被折叠的 条评论
为什么被折叠?



