关于导出函数与调用约定,C++ Builder 调用 VC++ 编译的DLL



VC++中的导出DLL如下声明,未使用.def文件定义导出:

extern "C" __declspec(dllimport) int __stdcall fnVCDLL(void);


VC++生成的DLl中实际导出名称为:

_fnVCDLL@0


C++ Builder 中使用如下声明导入:

extern "C" __declspec(dllimport) int __stdcall fnVCDLL(void);

使用implib将VC++生成的dll对应lib生成C++ Builder格式并加入到工程中


在C++ Builder中直接调用成功:
int i=fnVCDLL();


如果VC++的DLL使用.def文件定义导出,生成的实际导出名为:

fnVCDLL


居然调用也能成功。


现在去掉VC++中的extern "C" 和导出声明,用.def定义导出:

int __stdcall fnVCDLL(void);


.def定义如下:

LIBRARY VCDLL

EXPORTS

 fnVCDLL;


重新生成lib和dll,在C++ Builder中的声明不变,直接调用成功,如果C++ Builder中去掉extern "C",则编译不通过:

__declspec(dllimport) int __stdcall fnVCDLL(void);


同时吧VC++和C++Builder中的__stdcall换成__cdecl,重新生成lib和dll,好吧,这回C++ Builder编译报错:
_fnVCDLL 找不到,名字多了个下划线

回VC++,把fnVCDLL的名称改为_fnVCDLL,.def中的也要改,重新生成lib和dll,C++ Builder调用正常。

看来,主要还是导出函数命名约定的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

螃蟹@横着走

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值