⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chap9_3.htm

📁 着重介绍基于C++的web编程技术
💻 HTM
📖 第 1 页 / 共 3 页
字号:
    <p>if(hLibrary&gt;=32)</p>
    <p>{</p>
    <p>lpFunc=GetProcAddress(hLibrary,</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">ReadImage</font><font SIZE="3">”</font><font FACE="Times New Roman" SIZE="3">);</p>
    <p>if(lpFunc!=(FARPROC)NULL)</p>
    <p>(*lpFunc)((LPCTSTR)strFileName);</p>
    <p>FreeLibrary(hLibrary);</p>
    <p>}</p>
    <p>LoadLibrary</font><font SIZE="3">函数装入所需的动态连接库,并返回库的句柄。如果句柄小于</font><font FACE="Times New Roman" SIZE="3">32</font><font SIZE="3">,则载入库失败,错误含义参见有关手册。</font><font FACE="Times New Roman" SIZE="3">GetProcAddress</font><font SIZE="3">函数使用函数名字取得函数的地址。利用该函数地址,就可以访问动态连接库的函数了。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>FreeLibrary</font><font SIZE="3">通过检查动态连接库的引用计数器,判断是否还有别的程序在使用这个动态连接库。如果没有,就从内存中移去该动态连接库;如果有,将动态连接库的使用计数器减</font><font FACE="Times New Roman" SIZE="3">1</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3">LoadLibrary</font><font SIZE="3">则将引用计数加</font><font FACE="Times New Roman" SIZE="3">1</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">在用户动态连接库中,也可以使用</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">类。这时,可以选择静态连接和动态连接两种方式使用</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">库。</font><font FACE="Times New Roman"><b></p>
    <p></b></font><font color="#3973DE" FACE="Times New Roman">9.3.2 MFC</font><font color="#3973DE">扩展类库(<font FACE="Times New Roman">_AFXDLL</font>)</font></p>
    <p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">除了创建具有</font><font FACE="Times New Roman" SIZE="3">C</font><font SIZE="3">语言接口的用户动态连接库外,</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">还允许用户在动态连接库中创建</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">类的派生类,这些类作为</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">类的自然延伸出现,可以为其他</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">应用程序所使用,就象使用普通的</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">类一样。<b></p>
    <p></b><font color="#3973DE">创建扩展类库</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">要创建扩展类库,可以选择</font><font FACE="Times New Roman" SIZE="3">File-&gt;New</font><font SIZE="3">菜单,在</font><font FACE="Times New Roman" SIZE="3">Projects</font><font SIZE="3">类型中选择</font><font FACE="Times New Roman" SIZE="3">MFC AppWizard(dll)</font><font SIZE="3">。弹出</font><font FACE="Times New Roman" SIZE="3">MFC AppWizard 1of 1</font><font SIZE="3">对话框,从中选择</font><font FACE="Times New Roman" SIZE="3">MFC Extension DLL(using shared MFC DLL)</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3">AppWizard</font><font SIZE="3">就会生成</font><font FACE="Times New Roman" SIZE="3">Extension DLL</font><font SIZE="3">所需的框架。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">这里不再创建动态连接库,而是用</font><font FACE="Times New Roman" SIZE="3">Visual C++</font><font SIZE="3">的例子</font><font FACE="Times New Roman" SIZE="3">DLLHUSK</font><font SIZE="3">程序(在</font><font FACE="Times New Roman" SIZE="3">SAMPLES\MFC\ADVANCED \DLLHUSK</font><font SIZE="3">目录下)说明扩展类库的创建和使用。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">DLLHUSK</font><font SIZE="3">项目工作区中,包含三个工程:</font><font FACE="Times New Roman" SIZE="3">DLLHUSK</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">TESTDLL1</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">TESTDLL2</font><font SIZE="3">。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>TESTDLL1</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">TESTDLL2</font><font SIZE="3">分别定义了几个扩展类:</font><font FACE="Times New Roman" SIZE="3">CTextDoc</font><font SIZE="3">、</font><font FACE="Times New Roman" SIZE="3">CHelloView</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">CListOutputFrame</font><font SIZE="3">,</font><font FACE="Times New Roman" SIZE="3">DLLHUSK</font><font SIZE="3">是使用这些类的示例程序。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">CListOutputFrame</font><font SIZE="3">声明中,要加入</font><font FACE="Times New Roman" SIZE="3">AFX_EXT_CLASS</font><font SIZE="3">,表明它是一个</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">扩展类。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>class AFX_EXT_CLASS CListOutputFrame:public CMDIChildWnd</p>
    <p>{</p>
    <p>...</p>
    <p>}</p>
    <p></font><font SIZE="3">在函数定义处,还要包含</font><font FACE="Times New Roman" SIZE="3">afxdllx.h</font><font SIZE="3">头文件</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>// Initialization of MFC Extension DLL</p>
    <p>#include &quot;afxdllx.h&quot; // standard MFC Extension DLL routines</p>
    <p></font><font SIZE="3">类的成员函数使用与应用程序中类的使用大致相同。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">在</font><font FACE="Times New Roman" SIZE="3">CListOutputFrame</font><font SIZE="3">类定义文件中,还提供了一个</font><font FACE="Times New Roman" SIZE="3">C</font><font SIZE="3">函数。它的函数声明在类头文件</font><font FACE="Times New Roman" SIZE="3">testdll2.h</font><font SIZE="3">中:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>// Initialize the DLL, register the classes etc</p>
    <p>extern &quot;C&quot; AFX_EXT_API void WINAPI InitTestDLL2();</p>
    <p></font><font SIZE="3">这个函数用于初始化动态连接库和注册类:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>// Exported DLL initialization is run in context of running application</p>
    <p>extern &quot;C&quot; void WINAPI InitTestDLL2()</p>
    <p>{</p>
    <p>// create a new CDynLinkLibrary for this app</p>
    <p>new CDynLinkLibrary(extensionDLL);</p>
    <p>// nothing more to do</p>
    <p>}</p>
    <p></font><font SIZE="3">另外,源文件中还需要提供一个</font><font FACE="Times New Roman" SIZE="3">DllMain</font><font SIZE="3">函数:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY">DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)</p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">这个函数作用与前面的</font><font FACE="Times New Roman" SIZE="3">DllEntryPoint</font><font SIZE="3">类似。 </font><font FACE="Times New Roman" SIZE="3"></p>
    <p ALIGN="JUSTIFY"></font><font SIZE="3">扩展类库也需要一个</font><font FACE="Times New Roman" SIZE="3">DEF</font><font SIZE="3">文件,这个文件包含了动态连接库中可用的函数信息。由于现在动态连接库包含的是类,因此在函数命名上与用户动态连接库有所不同。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>EXPORTS</p>
    <p>?AddString@CListOutputFrame@@QAAXPBD@Z</p>
    <p>??_7CListOutputFrame@@6B@</p>
    <p>??_GCListOutputFrame@@UAAPAXI@Z</p>
    <p>?OnEditCut@CListOutputFrame@@IAAXXZ</p>
    <p>?_messageEntries@CListOutputFrame@@0QBUAFX_MSGMAP_ENTRY@@B</p>
    <p>??0CListOutputFrame@@QAA@XZ</p>
    <p>??1CListOutputFrame@@UAA@XZ</p>
    <p>?Clear@CListOutputFrame@@QAAXXZ</p>
    <p>?OnEditClear@CListOutputFrame@@IAAXXZ</p>
    <p>?OnEditCopy@CListOutputFrame@@IAAXXZ</p>
    <p>InitTestDLL2</p>
    <p>......</p>
    <p></font><font SIZE="3">有关函数名扩展的技术参考</font><font FACE="Times New Roman" SIZE="3">Visual C++</font><font SIZE="3">帮助文档。<b></p>
    <p></b><font color="#3973DE">使用扩展类动态连接库</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">要使用扩展类库,要将类库的头文件包含在工程中。然后在适当位置初始化类库,</font><font FACE="Times New Roman" SIZE="3">DLLHusk</font><font SIZE="3">是在</font><font FACE="Times New Roman" SIZE="3">InitInstance</font><font SIZE="3">中完成这一工作的。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>BOOL CHuskApp::InitInstance()</p>
    <p>{</p>
    <p>//...</p>
    <p>InitTestDLL1(); </p>
    <p>InitTestDLL2();</p>
    <p>//...</p>
    <p>} </p>
    <p></font><font SIZE="3">然后就可以象使用普通</font><font FACE="Times New Roman" SIZE="3">MFC</font><font SIZE="3">类一样使用扩展类库中定义的类了。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>m_pListOut=new CListOutputFrame;</font><font SIZE="3"><b></p>
    <p></b></font><font color="#3973DE" SIZE="3">访问</font><font color="#3973DE"><font FACE="Times New Roman" SIZE="3">DLL</font><font SIZE="3">中的资源</font></font><font FACE="Times New Roman" SIZE="3"></p>
    <p></font><font SIZE="3">当应用程序使用资源时,它按以下顺序查找资源:首先查找应用程序本身,看有没有对应的资源;如果没有,查找</font><font FACE="Times New Roman" SIZE="3">MFC400.DLL</font><font SIZE="3">(或</font><font FACE="Times New Roman" SIZE="3">MFC400D.DLL</font><font SIZE="3">,它包含调试信息)。再查找应用程序所带的动态连接库中的资源。如果想在</font><font FACE="Times New Roman" SIZE="3">DLL</font><font SIZE="3">中直接使用资源而不经过以上搜索顺序,可以使用</font><font FACE="Times New Roman" SIZE="3">AfxGetResouceHandle()</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">AfxSetResourceHandle()</font><font SIZE="3">函数。</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>AfxGetResourceHandle()</font><font SIZE="3">和</font><font FACE="Times New Roman" SIZE="3">AfxSetResouceHandle()</font><font SIZE="3">函数分别用来保存旧的资源句柄和设置新的资源句柄。比如,要想直接从</font><font FACE="Times New Roman" SIZE="3">DLL</font><font SIZE="3">中载入一个位图资源,可以这么调用:</font><font FACE="Times New Roman" SIZE="3"></p>
    <p>CBitmap mybitmap;</p>
    <p>HINSTANCE hInstOld=AfxGetResourceHandle()</p>
    <p>AfxSetResouceHandler(extensionDLL.hModule);</p>
    <p>if(!mybitmap.LoadBitmap(IDR_BITMAP));</p>
    <p>{</p>
    <p>//restore the old resouce chain and return error</p>
    <p>AfxSetResouceHandle(hInstOld);</p>
    <p>return FALSE;</p>
    <p>}</p>
    <p>AfxSetResouceHandle(hInstOld);</p>
    <p>//use this bitmap...</p>
    <p>return TRUE;</p>
    <p></font><font SIZE="3">还可以使用</font><font FACE="Times New Roman" SIZE="3">FindResource()</font><font SIZE="3">搜索资源表,寻找给定的资源。</p>
    <blockquote>
      </font><font FACE="Arial" SIZE="2"><b><p>HRSRC FindResource(</p>
    </blockquote>
    <p>HMODULE</b> <i>hModule</i><b>,</b></font> </p>
    <p><b><font SIZE="2"> </font><font FACE="Arial" SIZE="2"></p>
    <p>LPCTSTR</b> <i>lpName</i><b>,</b></font> </p>
    <p><b><font SIZE="2"> </font><font FACE="Arial" SIZE="2"></p>
    <p>LPCTSTR</b> <i>lpType</i> </font></p>
    <p><b><font SIZE="2"> </font><font FACE="Arial" SIZE="2"></p>
    <p>);</font><font SIZE="3"></p>
    <p>FindResource</b>带三个参数,第一个参数是模块句柄,第二个是要查找的资源名字,如“MYDIALOG”,第三个是资源类型,可参见Visual 
    C++文档。如果查找成功,则返回该资源句柄。可以用LoadResouce以该句柄为参数装入资源。</font><font SIZE="4"><b></p>
    </b></font><div align="center"><center><table border="0" cellpadding="0" cellspacing="0" width="615">
      <tr>
        <td><a href="chap9_2.htm">上一页</a></td>
        <td><p align="right"><a href="chap9_4.htm">下一页</a></td>
      </tr>
    </table>
    </center></div><font SIZE="5"><hr noshade color="#3973DE" size="1">
    <p align="center"></font><font size="2" color="#000000">本教程由<a href="http://vcdynasty.yeah.net">Visual C++王朝(Where programmers come together)</a>协助制作<br>
    未经许可,请勿以任何形式复制</font></td>
    <b>
  </tr>
</table>
</center></div>

<p ALIGN="CENTER"></b><font SIZE="5"> </font><font FACE="Times New Roman" SIZE="5"></p>
</font><font FACE="Times New Roman" SIZE="3">

<p></font><b><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>
</font></b>

<p><font SIZE="3"> </font><font FACE="Times New Roman" SIZE="3"></p>

<p></font> </p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -