VB调用DLL导出函数出现“Bad DLL call convention”的解决

原创 2006年05月31日 22:48:00
用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

 


 

参考网址:http://support.microsoft.com/kb/158905/EN-US/

VB调用vc写的dll的某个方法时的问题

第一,鉴于VB的速度和在位操作方面的不足,我用VC来编写一个DLL来实现一些功能。输出的函数YUYVtoRGB24 是没有返回值的。故在vb下声明用sub实现。如下,Public Declare Su...
  • amy0428
  • amy0428
  • 2009年08月05日 14:53
  • 1928

NSIS使用System::Call调用自定义dll中的导出函数

看NSIS的说明中关于System的部分 D.3 Calling an external DLL using the System.dll plug-in Some install...
  • patdz
  • patdz
  • 2013年01月24日 19:46
  • 7230

生成可导出函数的DLL VB6 插件

  • 2011年08月05日 22:07
  • 17KB
  • 下载

透过汇编另眼看世界之DLL导出函数调用

透过汇编另眼看世界之DLL导出函数调用 前言:我一直对DLL技术充满好奇,一方面是因为我对DLL的导入/导出机制还不是特别的了解,另一面是因为我发现:DLL技术在Windows平台下占有...

VC++编写DLL导出函数及其调用方法

  • 2015年01月07日 14:29
  • 256KB
  • 下载

更方便地动态调用DLL导出函数(VC++)

Submitted by 李马 您可以任意转载这篇文章,但请在转载时注明原始链接和作者,谢谢。 在一般情况下,动态调用DLL导出函数的方法是: 用typedef为目标函数定义函数指针类型。用Get...

DLL导出函数名称改编的解决方法

1.DLL编译后导出函数名称改编   在编写一个DLL后,为了能被别的程序调用,需要将被使用的函数导出; 但是一般的编译器都会将到处函数名称改编; 例如:在VC中新建一个空的win32 dll...

DLL导出函数名称改编的解决方法

DLL导出函数名称改编的解决方法

VC++编写DLL导出函数及其调用方法

DLL (Dynamic Link Library)动态链接库,是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件,其优点主要有:1. 有助于节省内存;2. 有助于资源共享;3. 不...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB调用DLL导出函数出现“Bad DLL call convention”的解决
举报原因:
原因补充:

(最多只允许输入30个字)