请教 VC2005生成一个DLL,C调用函数不成功问题

okay007 2012-07-10 11:45:13
本人菜鸟,请教一个问题:VC2005生成一个DLL。头文件定义如下:
extern "C"
{
__declspec(dllexport) int __stdcall getComponets(FILE *fp);
}
但是用纯C语言 用GetProcAddress(hinstLib,"getComponets");动态调用始终找不到getComponets函数,
用depends工具查看导出函数,函数名是 _getComponets@4 不是 getComponets 如何解决?谢谢!
...全文
127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
okay007 2012-07-10
  • 打赏
  • 举报
回复
TO 6楼:
您的意思是 __stdcall 规则的 extern "C" 就无效了?
必须.def 吗?那我试试。
okay007 2012-07-10
  • 打赏
  • 举报
回复
TO 4楼
extern "C" 对 C++ 无效?
真的吗?那对什么有效?
Saleayas 2012-07-10
  • 打赏
  • 举报
回复
特别是 __stdcall
okay007 2012-07-10
  • 打赏
  • 举报
回复
3楼朋友,我已经用extern "C" 修饰了,请看楼主帖子,如不修饰更完会是这 ?getComponets@@YGHPAU_iobuf@@@Z就不会是_getComponets@4这样。
Saleayas 2012-07-10
  • 打赏
  • 举报
回复
extern "C" 对 C++ 无效!
Gloveing 2012-07-10
  • 打赏
  • 举报
回复
用extern "C" 修饰
防止发生C++名字改编
okay007 2012-07-10
  • 打赏
  • 举报
回复
不用.def 不行吗?不是从DLL中导出函数有两种方法吗?
1,创建DLL时使用模块定义 .DEF 文件
2,定义函数时使用关键字_declspec(dllexport)

我用的方法2,应该不会有问题。函数可以导出,就是函数名对不上。



Saleayas 2012-07-10
  • 打赏
  • 举报
回复
.def
Saleayas 2012-07-10
  • 打赏
  • 举报
回复
__stdcall
名称修饰约定
下划线 (_) 前缀为名称。 该名称后跟在 (@) 后跟符号 (十进制) 在参数列表。 因此,作为 int func( int a, double b ) 声明的函数修饰如下所示: _func@12

__cdecl
名称修饰约定
下划线字符 (_) 前缀的名称,但,在导出使用 C 链接的 __cdecl 功能。

最后一句就是为什么 __cdecl 和 __stdcall 之类的区别。
okay007 2012-07-10
  • 打赏
  • 举报
回复
可以了谢谢 Saleayas
再请教一下DLL中一个函数getComponets导出(没用.def文件)
不用extern "C"时
?getComponets@@YGHPAU_iobuf@@@Z //__stdcall约定
?getComponets@@YAHPAU_iobuf@@@Z //__cdecl 约定

用 extern "C"
_getComponets@4 //__stdcall约定
getComponets //__cdecl约定
改用.def文件就完全是C方式了getComponets //__stdcall约定
请问出现这种的原因?_getComponets@4 //__stdcall约定
谢谢!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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