关于#ifdef __cplusplus……和动态库的调用

zxx_0405 2009-05-05 04:03:26
在bcb6.0中调用vc写的动态库时,对接口文件进行了下修改,
下面代码中红色部分是在接口.h文件中新加入的

extern "C"  int aa(int Length);
#endif
#ifdef __cplusplus
extern "C" {
#endif

typedef HRESULT (WINAPI *WM_AA)(int Length);

#ifdef __cplusplus
}
#endif


现在动态库改为bcb6.0写的了,我想还用这个调用方式,但是运行aa函数时就会出错,
project project1.exe raised exception class eaccessviolation with message 'access violation at address 00000000.write of address 000000000'.process stopped. use step or run to continue.

为什么不能调用,是不是函数本来就是c++写的了就不能用#ifdef __cplusplus了?还是其他方面有问题?知道的帮忙指点下,谢谢了。
...全文
195 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingzhongrong 2009-05-06
  • 打赏
  • 举报
回复
你怎么调用的,VC和CB使用的lib格式不同,需要进行转换或者使用动态调用(LoadLibrary、GetProcAddress)
另外,保证调用规范相同、dll导出函数名正确。
jame2001 2009-05-06
  • 打赏
  • 举报
回复
DLL裡面程序名稱會不同, 所以調用不到...
使用以下方式解決
extern "C" __declspec(dllexport) int __stdcall aa(int Length);
zxx_0405 2009-05-06
  • 打赏
  • 举报
回复
大概我的问题描述的不够清楚
按我上面的写法调用vc写的动态库是没有问题的
但是调用c++builder写的动态库就不行,
这两个动态库函数完全相同,只是语言改了一下

我是想问为什么不能调用c++builder写的动态库?


My_Love 2009-05-06
  • 打赏
  • 举报
回复
用C++编译等价:
extern "C" {

typedef HRESULT (WINAPI *WM_AA)(int Length);

}



用C编译等价:
typedef HRESULT (WINAPI *WM_AA)(int Length);

/*

extern "C" 是告诉C++编译器,用C语言的调用约定.

因为C++的默认调用规则和C是不一样的.
为什么不一样呢?想想函数重载,和类的成员函数.

*/
jame2001 2009-05-06
  • 打赏
  • 举报
回复
extern "C" __declspec(dllexport) int __stdcall aa(int Length);
zxx_0405 2009-05-05
  • 打赏
  • 举报
回复
红色没出来啊
#ifdef __cplusplus
extern "C" {
#endif

typedef HRESULT (WINAPI *WM_AA)(int Length);

#ifdef __cplusplus
}
#endif

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧