找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3470|回复: 1

理论科普:如何让exe输出函数之输出函数自导自演

[复制链接]

307

主题

228

回帖

7333

积分

用户组: 真·技术宅

UID
2
精华
76
威望
291 点
宅币
5583 个
贡献
253 次
宅之契约
0 份
在线时间
947 小时
注册时间
2014-1-25
发表于 2014-8-5 22:48:39 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
熟悉编程的人员都会知道导出函数在dll中较为常见,然而有没有考虑过exe可以导出函数呢?
这里解决如下几个问题:
①exe如何导出函数?
②导出符号包括导出函数、导出变量和导出类,导出函数和导出变量的区别是什么?
③如果导出符号在导出时定义为const,能否在得到导入函数后修改其值?
④如何让exe使用自己导出的函数,实现自导自演?
⑤这种形式的应用场合?

解决①:
其实导出使用的语法都一样,使用预编译指令_declspec(dllexport)即可,注意导出函数要与声明时格式相同,否则无法导出!如果导出成功,可以用dumpbin或dependency等工具看到。

解决②:
导出函数其实是将函数指针位置提供给编译器,将其位置添加到导出表中,导出变量也是将变量指针位置添加到导出表,都是指针,区别仅在于函数用来调用,变量则用来读写,不过其实都是可读可写可执行的(如果没有const之类的限制)

解决③:
修改const修饰的符号值以后,程序崩溃,然而在exe中,const类型也是可以修改的,

解决④:
组合使用api函数:GetModuleHandle()和GetProcAddress()

解决⑤:
这玩意一般场合还真用不到,做法十分怪癖,我也仅在控制台应用和魔兽争霸主程序中见过这种用法。
一般来说,这种做法考虑到exe自身导出函数同时被别的dll和exe自身使用,而不是加载和使用其他dll函数,才会这么用。

代码:
  1. #include <stdio.h>
  2. #include <windows.h>

  3. extern "C" _declspec(dllexport) void func();//导出函数
  4. extern "C" _declspec(dllexport) const int val=1234;



  5. void func()
  6. {
  7.         printf("Hello World!\n");
  8. }


  9. int main(int argc, char* argv[])
  10. {
  11.         HINSTANCE hcurrent=GetModuleHandle(NULL);
  12.         FARPROC FUNC=GetProcAddress(hcurrent,"func");
  13.         ((void(*)())FUNC)();//调用当前exe导出函数

  14.         FARPROC VAL=GetProcAddress(hcurrent,"val");
  15.         *FUNC=*VAL;
  16. //        *((int*)VAL)=1;//此处如果修改,下面会崩溃

  17.         printf("val=%d\n",*(int*)VAL);//存储的是指针
  18.         printf("val=%d\n",*(int*)FUNC);//存储的是指针

  19.         getchar();
  20.         return 0;
  21. }
复制代码
回复

使用道具 举报

1110

主题

1651

回帖

7万

积分

用户组: 管理员

一只技术宅

UID
1
精华
244
威望
743 点
宅币
24221 个
贡献
46222 次
宅之契约
0 份
在线时间
2296 小时
注册时间
2014-1-26
发表于 2014-8-6 04:32:43 | 显示全部楼层
这种EXE性质上和DLL差不多。
回复 赞! 靠!

使用道具 举报

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-4-18 11:15 , Processed in 0.041332 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表