DLL系列---关于DLL本身的一些其他相关

来源:互联网 发布:卖家数据 编辑:程序博客网 时间:2024/06/09 07:26

DLL系列---关于DLL本身的一些其他相关

一.关于导出函数和变量的另一种写法

在前面的dll中对于导出的函数和数据我们是在函数或变量的声明前添加_declspec(dllimport)实现导出的目的,但是当使用其他编译器来实现我们的执行文件来调用我们在VS平台上生成的dll时会遇到链接错误的问题,主要问题是VS在导出符号或则变量的时候会给函数名加上特殊的后缀如_@8。为得到未经过改变的函数名,我们必须使用其他方法导出我们的函数和变量。

1.使用def文件的方法导出

<span style="font-family:Microsoft YaHei;font-size:14px;">; MyLib.def : Declares the module parameters for the DLL.LIBRARY      "MyLib"SECTIONSshareddata READ WRITE SHAREDEXPORTSg_nResultAdd</span>

上面是我们前一节中的MyLib链接库中的def文件

2.直接在dll源文件中加入一行声明

<span style="font-family:Microsoft YaHei;font-size:14px;">#pragma  comment(link,"/export:Add=_Add@8");</span>

二.DLL的入口点函数

DllMain函数的一般写法
<span style="font-family:Microsoft YaHei;font-size:14px;">BOOL APIENTRY DllMain(HANDLEhModule, DWORD ul_reason_for_call, LPVOIDlpReserved){printf("hModule.%p lpReserved.%p \n", hModule,lpReserved);switch (ul_reason_for_call){case DLL_PROCESS_ATTACH://一般Dll第一次被映射到进程地址空间的时候被调用printf("Process attach. \n");break;case DLL_PROCESS_DETACH://当Dll被从地址空间被撤销的时候调用printf("Process detach. \n");break;case DLL_THREAD_ATTACH:printf("Thread attach. \n");break;case DLL_THREAD_DETACH:printf("Thread detach. \n");break;}return (TRUE);}</span>
DLL使用DllMain函数主要是来对自己的初始化操作,所以dll中不是都存在DllMain函数。

三.模块的基地址重定位

每个dll模块都有一个首选基地址,一般为0x00400000,但当一个进程需要调用多个dll时默认的dll首选基地址会冲突,为了增加程序执行效率我们可以使用Rebase工具来为每个模块设置首选基地址。

0 0
原创粉丝点击