理论科普:如何让exe输出函数之输出函数自导自演
熟悉编程的人员都会知道导出函数在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;
} 这种EXE性质上和DLL差不多。
页:
[1]