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

📄 bcb_a9.htm

📁 C++ Builder学习中文版,让学者对其有一定的理解.
💻 HTM
字号:
 

<html>

<head>

<title>C++Builder中动态库的链接问题</title>

<meta http-equiv="目录类型" content="文本/html; 字符集=gb2312">

</head>

<body bgcolor="#FFFFFF">

<table width="100%" border="0" height="285">

  <tr> 

    <td height="35"> 

      <div align="center" class="p14"><font color="#000000">C++Builder中动态库的链接问题</font></div>

    </td>

  </tr>

  <tr valign="top"> 

    <td>

      <p align=center><strong><font color="#000000">谢伟成、王斌</font></strong></p>

      <p><font color="#000000">  动态库链接到应用程序中主要有两种方式:隐式链接和显式链接。隐式<br>

        链接是常用方式。<br>

        <br>

        如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入<br>

        库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid  

        OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。<br> 

        <br> 

        显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。<br>

        <br>

        步骤:<br>

        <br>

        1. 调用LoadLibrary函数装载DLL并得到模块句柄;<br> 

        <br> 

        2. 调用GetProcAddress函数获取指定导出函数的指针;<br> 

        <br> 

        3. 用这个函数的指针调用该函数;<br> 

        <br> 

        4. 使用完毕后,用FreeLibrary释放DLL。<br> 

        <br> 

        例子:<br>

        <br>

        用VC++制作一个动态库:<br>

        <br>

        选new→Project→Win32—Dynamic—Link Library,加入addit.cpp<br> 

        <br> 

        extern ″C″<br> 

        <br> 

        { void —declspec( dllexport ) addit(int a, int b, int *c)<br> 

        <br> 

        { *c = a + b; <br> 

        <br> 

         }<br> 

        <br> 

        }<br>

        <br>

        addit.h<br>

        <br>

        extern ″C″<br> 

        <br> 

        {void addit(int a, int b, int *c);}<br> 

        <br> 

        编译链接生成addit.dll和addit.lib。在C++Builder程序中调用addit函数。<br>

        <br>

        C++Builder程序中:<br>

        <br>

        {HINSTANCE handle; //DLLa模块的句柄<br> 

        <br> 

         FARPROC lpFarProc; <br> 

        <br> 

        void (*lpaddit)(int,int,int *);<br> 

        <br> 

        //指向addit函数的指针<br> 

        <br> 

        int ntemp;<br> 

        <br> 

        handle = LoadLibrary(″addit.dll″); <br> 

        <br> 

        //装载addit.dll, 得到该库句柄<br> 

        <br> 

        //addit.dll位于当前目录下<br>

        <br>

        lpFarProc = GetProcAddress(handle,″addit″); <br> 

        <br> 

        //得到指向函数addit的指针<br>

        <br>

        lpaddit = (void(—cdecl *)(int, int, int *))lpFarProc; //指针类型转换<br> 

        <br> 

        lpaddit(2,3,&ntemp); //使用addit函数<br> 

        <br> 

        FreeLibrary(handle); <br>

        <br>

        //将addit.dll从程序中卸掉<br>

        <br>

        }<br>

        <br>

        此程序在VC++ 5.0 和C++Builder 3.0下通过。<br> 

        <br> 

        使用C++Builder中提供的导入库生成工具:先预处理,后隐式链接。<br>

        <br>

        步骤:<br>

        <br>

        1.用C++Builder提供的implib.exe工具重新生成该动态库(xxx.dll)的导入库(xxx.lib)。命令如下:<br>

        <br>

        implib addit.lib addit.dll。<br> 

        <br> 

        addit.dll为已有动态库,addit.lib为要生成的导入库。由此生成的导入库addit.lib格式与C++Builder开发平台是相容的;<br>

        <br>

        2.在动态库的头文件addit.h中,对其输出函数重新说明,语句如下:<br>

        <br>

         extern —stdcall void addit( int a, int b, int *c);<br> 

        <br> 

        3.然后采用隐式链接法,将重新生成的导入库(addit.lib)和重新说明的头文件(addit.h)加入到C++Builder应用程序的工程项目中,进行编译和连接。<br>

        <br>

        addit.dll按上述步骤操作,在VC++ 5.0 和C++Builder 3.0下通过。<br> 

      </font> 

      </p> 

     </td> 

  </tr> 

</table> 

<br> 

</body> 

</html> 

⌨️ 快捷键说明

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