📄 基于visualc++6.0的ddl编程实现.htm
字号:
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>
</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'>Visual C++6.0</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'>File\New\Project</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
Dynamic-Link Library</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 AppWizard[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'>Non-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'>Regular 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'>Extension 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>
<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'>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'> Win32
Dynamic-Link Library</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'>Non-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'><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'>C</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'>WINMAIN</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'>Non-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'>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'>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'>.CPP</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>
<br>
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID
lpReserved)<br>
{<br>
switch( ul_reason_for_call )<br>
{<br>
case DLL_PROCESS_ATTACH:<br>
.......<br>
case DLL_THREAD_ATTACH:<br>
.......<br>
case DLL_THREAD_DETACH:<br>
.......<br>
case DLL_PROCESS_DETACH:<br>
.......<br>
}<br>
return TRUE;<br>
} <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'>hMoudle</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'>(</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'>_DGROUP</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'>)</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'>ul_reason_for_call</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_PROCESS_ATTACH:
</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_THREAD_ATTACH:
</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_PROCESS_DETACH:
</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_THREAD_DETACH:
</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'>lpReserved</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>
<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'>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'>_declspec(dllexport)</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'>.Def</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'>DEF</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>
<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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -