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"
SECTIONS
shareddata READ WRITE SHARED
EXPORTS
g_nResult
Add
</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工具来为每个模块设置首选基地址。