📄 win32环境下dll编程原理.htm
字号:
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>版本仍然采用的是标识号链接。一个典型的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>MFC</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>程序可能会链接到数百个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>MFC DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数上。采用标识号链接的应用程序的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>EXE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件体相对较小,因为它不必包含导入函数的长字符串符号名。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
<br>
</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:
Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>四、编写</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DllMain</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
<br>
DllMain</span><span style='mso-bidi-font-size:10.5pt;font-family:
宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:
Tahoma'>函数是</span><span lang=EN-US style='mso-bidi-font-size:10.5pt;
font-family:Tahoma'>DLL</span><span style='mso-bidi-font-size:10.5pt;
font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;
mso-bidi-font-family:Tahoma'>模块的默认入口点。当</span><span lang=EN-US
style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>Windows</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>加载</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLLMain</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLLMain</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数不仅在将</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>链接加载到进程时被调用,在</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块与进程分离时(以及其它时候)也被调用。下面是一个框架</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLLMain</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数的例子。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
HINSTANCE g_hInstance; <br>
extern "C" int APIENTRY DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved) <br>
{ <br>
if(dwReason==DLL_PROCESS_ATTACH) <br>
{ <br>
TRACE0("EX22A.DLL Initializing!\n"); <br>
//</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:
Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>在这里进行初始化</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
} <br>
else if(dwReason=DLL_PROCESS_DETACH) <br>
{ <br>
TRACE0("EX22A.DLL Terminating!\n"); <br>
//</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:
Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>在这里进行清除工作</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
} <br>
return 1;//</span><span style='mso-bidi-font-size:10.5pt;font-family:
宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:
Tahoma'>成功</span><span lang=EN-US style='mso-bidi-font-size:10.5pt;
font-family:Tahoma'> <br>
} <br>
</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;
mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:
Tahoma'>如果程序员没有为</span><span lang=EN-US style='mso-bidi-font-size:10.5pt;
font-family:Tahoma'>DLL</span><span style='mso-bidi-font-size:10.5pt;
font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;
mso-bidi-font-family:Tahoma'>模块编写一个</span><span lang=EN-US style='mso-bidi-font-size:
10.5pt;font-family:Tahoma'>DLLMain</span><span style='mso-bidi-font-size:
10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:
Tahoma;mso-bidi-font-family:Tahoma'>函数,系统会从其它运行库中引入一个不做任何操作的缺省</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLLMain</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数版本。在单个线程启动和终止时,</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLLMain</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数也被调用。正如由</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>dwReason</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>参数所表明的那样。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
<br>
</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:
Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>五、模块句柄</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
<br>
</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;
mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:
Tahoma'>进程中的每个</span><span lang=EN-US style='mso-bidi-font-size:10.5pt;
font-family:Tahoma'>DLL</span><span style='mso-bidi-font-size:10.5pt;
font-family:宋体;mso-ascii-font-family:Tahoma;mso-hansi-font-family:Tahoma;
mso-bidi-font-family:Tahoma'>模块被全局唯一的</span><span lang=EN-US
style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>32</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>字节的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HINSTANCE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>句柄标识。进程自己还有一个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HINSTANCE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>句柄。所有这些模块句柄都只有在特定的进程内部有效,它们代表了</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>或</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>EXE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块在进程虚拟空间中的起始地址。在</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>Win32</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>中,</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HINSTANCE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>和</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HMODULE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的值是相同的,这个两种类型可以替换使用。进程模块句柄几乎总是等于</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>0x400000</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>,而</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块的加载地址的缺省句柄是</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>0x10000000</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>。如果程序同时使用了几个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块,每一个都会有不同的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HINSTANCE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>值。这是因为在创建</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>文件时指定了不同的基地址,或者是因为加载程序对</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>代码进行了重定位。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'> <br>
</span><span style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:
Tahoma;mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>模块句柄对于加载资源特别重要。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>Win32 </span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>的</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>FindResource</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>函数中带有一个</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>HINSTANCE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>参数。</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>EXE</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>和</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
mso-hansi-font-family:Tahoma;mso-bidi-font-family:Tahoma'>都有其自己的资源。如果应用程序需要来自于</span><span
lang=EN-US style='mso-bidi-font-size:10.5pt;font-family:Tahoma'>DLL</span><span
style='mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-font-family:Tahoma;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -