📄 关于vc中的dll的编程.htm
字号:
10.5pt;font-family:Tahoma'><br>
<br>
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'><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'>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'>Look here!</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>
void _declspec(dllexport) JustSoSo()<br>
{<br>
MessageBox(NULL,"It's so easy!","Hahaha......",MB_OK);<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'><br>
class _declspec(dllexport) Easy<br>
{<br>
//add your class definition...<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'>_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'>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'>.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'><br>
<br>
Ok!</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'>Just so easy!<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>
<br>
[2]<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 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'><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'>LoadLibrary</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'>AfxLoadLibrary</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'>GetProcAddress()</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'>FreeLibrary</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'>AfxLoadLibrary</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'>.LIB</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'>void JustSoSo();</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'>LoadLibrary()</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'>FreeLibrary().<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'>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>
<br>
[3]<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'>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'>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'>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'>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>
// MyRegularDll.h:main header file for the MYREGULARDLL DLL<br>
#include "resource.h" // main symbols<br>
<br>
class CMyRegularDllApp : public CWinApp<br>
{<br>
public:<br>
CMyRegularDllApp();<br>
// Overrides<br>
<br>
// ClassWizard generated virtual function overrides<br>
//{{AFX_VIRTUAL(CMyRegularDllApp)<br>
//}}AFX_VIRTUAL<br>
<br>
//{{AFX_MSG(CMyRegularDllApp)<br>
// NOTE - the ClassWizard will add and<br>
// remove member functions here.<br>
// DO NOT EDIT what you see in these blocks<br>
// of generated code !<br>
//}}AFX_MSG<br>
<br>
DECLARE_MESSAGE_MAP()<br>
};<br>
<br>
//MyRegularDll.cpp:Defines the initialization routines for the DLL.<br>
//<br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -