源起
之前为设备的DLL供客户二次开发,包括C++,C#等调用都没有问题,以一个函数为例,C文件和H文件里写法如下:
UCHAR CharToHex(UCHAR ch)
extern "C" __declspec(dllexport) UCHAR CharToHex(UCHAR ch);//字符转16进制
但日前有一个客户还在用VB6.0开发,调用总是出现:实时错误“49”:DLL调用约定错误。
解决问题
在网上查了一些资料,如下三个地方修改才可以。
C文件中修改如下:
UCHAR __stdcall CharToHex(UCHAR ch)
extern "C" __declspec(dllexport) UCHAR __stdcall CharToHex(UCHAR ch);//字符转16进制
原因是VB6.0中调用默认是标准的,需要强制转换成“__stdcall”。
; xxxDll.def : 声明 DLL 的模块参数。
LIBRARY
EXPORTS
; 此处可以是显式导出
CharToHex
参考
总结一下DLL函数声明的一些问题:http://blog.csdn.net/wangwenjing90/article/details/9047853/
DLL 导出函数 _stdcall 和 _cdecl调用约定:http://www.jb51.cc/article/p-pdiqgyed-bka.html