- UID
- 2
- 精华
- 积分
- 7632
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
熟悉编程的人员都会知道导出函数在dll中较为常见,然而有没有考虑过exe可以导出函数呢?
这里解决如下几个问题:
①exe如何导出函数?
②导出符号包括导出函数、导出变量和导出类,导出函数和导出变量的区别是什么?
③如果导出符号在导出时定义为const,能否在得到导入函数后修改其值?
④如何让exe使用自己导出的函数,实现自导自演?
⑤这种形式的应用场合?
解决①:
其实导出使用的语法都一样,使用预编译指令_declspec(dllexport)即可,注意导出函数要与声明时格式相同,否则无法导出!如果导出成功,可以用dumpbin或dependency等工具看到。
解决②:
导出函数其实是将函数指针位置提供给编译器,将其位置添加到导出表中,导出变量也是将变量指针位置添加到导出表,都是指针,区别仅在于函数用来调用,变量则用来读写,不过其实都是可读可写可执行的(如果没有const之类的限制)
解决③:
修改const修饰的符号值以后,程序崩溃,然而在exe中,const类型也是可以修改的,
解决④:
组合使用api函数:GetModuleHandle()和GetProcAddress()
解决⑤:
这玩意一般场合还真用不到,做法十分怪癖,我也仅在控制台应用和魔兽争霸主程序中见过这种用法。
一般来说,这种做法考虑到exe自身导出函数同时被别的dll和exe自身使用,而不是加载和使用其他dll函数,才会这么用。
代码:
- #include <stdio.h>
- #include <windows.h>
- extern "C" _declspec(dllexport) void func();//导出函数
- extern "C" _declspec(dllexport) const int val=1234;
- void func()
- {
- printf("Hello World!\n");
- }
- int main(int argc, char* argv[])
- {
- HINSTANCE hcurrent=GetModuleHandle(NULL);
- FARPROC FUNC=GetProcAddress(hcurrent,"func");
- ((void(*)())FUNC)();//调用当前exe导出函数
- FARPROC VAL=GetProcAddress(hcurrent,"val");
- *FUNC=*VAL;
- // *((int*)VAL)=1;//此处如果修改,下面会崩溃
- printf("val=%d\n",*(int*)VAL);//存储的是指针
- printf("val=%d\n",*(int*)FUNC);//存储的是指针
- getchar();
- return 0;
- }
复制代码 |
|