在线等 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都是导出的原名,并没有下划线。
...全文
171 12 打赏 收藏 转发到动态 举报
写回复
用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)了嘛~
一、简介   AheadLib 是用来生成一个特洛伊DLL的工具,用于分析DLL中的函数参数调用(比如记录Socket send了什么等等)、更改函数功能(随心所欲了:)、更改界面功能(比如在Hook面生成一个按钮,截获事件等等)。 二、使用   1.用 AheadLib 打开要模拟的 DLL,生成一个 CPP 文件。   2.用 Visual Studio 6.0/.NET 建立一个 DLL 工程,把这个 CPP 文件加入到项目中。   3.使用 Release 方式编译,生成的 DLL 将和原来的 DLL 具有一模一样的导出函数,并且能顺利把这些函数转发到原来的函数中。   4.AheadLib 还可以生成 Hook 代码,用于截取当前进程的所有消息,这样就可以随心所欲地处理各种消息了 (修改第三方程序界面功能的好助手)。 三、备注   1.如果导出函数过多,在 Visual Studio 6.0 中,如果出现编译错误,请在项目属性关闭与编译头功能。   2.如果是 C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。   3.如果是 NONAME 或者 C _CDECL 方式导出(比如 DEF 导出,大多数Windows DLL都是这种情况,比如WS2_32等等),则使用#pragma comment(linker, "/EXPORT:...)导出,且指定导出序号。   4.如果系统中没有 DbgHelp.dll,将无法识别 C++ 模式的导出

64,636

社区成员

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

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