📄 关于vc中的dll的编程.htm
字号:
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>
1.Non-MFC Dlls<br>
2.Regular Dlls<br>
3.Extension Dlls Note<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>
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'>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'>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'>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'>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</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>
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 Dlls</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</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'>CWinApp</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</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</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</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'>VC</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>
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'>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</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'>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</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>
[1]<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'>Non-MFC DLLs</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>
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'>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'><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'>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'>linker</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'>/ENTRY</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'><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'>),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'><br>
<br>
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'><br>
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'><br>
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'><br>
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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -