在线等 dll里c函数编译后导出的名字

followwater 2005-12-16 04:49:46
#define EXPORT extern "C" __declspec (dllexport)

void LoadDir(const char * dir,ofstream& of);

EXPORT int CALLBACK LoadaDir(const char * dir)
{
ofstream of("c:\\out.txt");
LoadDir(dir,of);
return 0;
};
该dll编译后导出名为_LoadaDir@4的函数,但书里说应该是_LoadaDir,
请问大侠应该怎样声明函数才能导出_LoadaDir,最好是原名LoadaDir,windows的
库dll都是导出的原名,并没有下划线。
...全文
177 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
followwater 2005-12-17
  • 打赏
  • 举报
回复
ok ,thanks for all,specially to vrace,atfield
ATField 2005-12-16
  • 打赏
  • 举报
回复
稍微更正一下,__fastcall应该前面还有一个@, 比如@LoadaDir@4
另外__declspec(dllexport)仅会对__cdecl进行处理,去掉前面的下划线(对于一般全局函数来说缺省就是__cdecl),而对于其他两种不会处理
ATField 2005-12-16
  • 打赏
  • 举报
回复
你这里出问题的原因是你使用了CALLBACK宏,CALLBACK一般定义为__stdcall
当你使用extern "C"的情况下,
__stdcall会使函数名字前面加一个下划线,后面加一个@再加上参数的字节数,比如你的Case就是4个字节
__fastcall类似__stdcall,不过前面没有下划线
__cdecl则是前面仅仅有一个下划线
如果不用extern "C"话则使用C++命名机制,涉及到C++ Name Mangling,比较复杂,编译器之间也不太一样

回到你的程序,如果在你的程序里面把CALLBACK去掉的话,单单使用__declspec(dllexport)就对了。这个时候编译器会自动替你去掉下划线,输出的便是LoadaDir。另外一个方法是使用.def文件,在EXPORTS里面使用LoadaDir=_LoadaDir@4的形式也可以达到同样效果



vrace 2005-12-16
  • 打赏
  • 举报
回复
int WINAPI LoadaDir(const char* szDir)
{
...
}

然后创建个 .def 文件
LIBRARY xxx
EXPORTS
LoadaDir @1
followwater 2005-12-16
  • 打赏
  • 举报
回复
该函数在vc能正确调用,但编译后名字都是_LoadaDir@4。
请用dumpbin 察看inport 表,
或者不要让她找到dll,编译器提示找不到_LoadaDir@4这个符号
piaochen_2002 2005-12-16
  • 打赏
  • 举报
回复
河马正确
followwater 2005-12-16
  • 打赏
  • 举报
回复
csdn的高手呢?看来我今天没法纳,郁闷
piaochen_2002 2005-12-16
  • 打赏
  • 举报
回复
extern "C" (C大写)
{


}
lujun-cc 2005-12-16
  • 打赏
  • 举报
回复
楼主的声明是正确的麻
dragonzxh 2005-12-16
  • 打赏
  • 举报
回复
VC++输出函数时使用__declspec(dllexport),而不再用_export修饰字。
__declspec(dllexport)在C调用约定、C编译情况下可以去掉输出函数名的下划线前缀。extern "C"使得在C++中使用C编译方式成为可能,在一个C++文件中,用extern "C"来指明该函数使用C编译方式。例如,在一个C++文件中,有如下函数:
extern "C" {void __declspec(dllexport) __cdecl Test(int var);}
其输出函数名为:Test
followwater 2005-12-16
  • 打赏
  • 举报
回复
我用tdump查出是_LoadaDir@4,而且在delphi只有用_LoadaDir@4才能成功调用
dragonzxh 2005-12-16
  • 打赏
  • 举报
回复
你这样导出的就是原来名字吧~~~~不是已经#define EXPORT extern "C" __declspec (dllexport)了嘛~

65,192

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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