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

📄 vcc31.htm

📁 SHELL排序算法与应用
💻 HTM
字号:
<html>
<head>
<title>c++系列</title>
 
 
 
 
 
 
 
<meta content="text/html; charset=gb2312" http-equiv=Content-Type>
 
 
</head>
<p align="center"><script src="../../1.js"></script></a>

<body bgcolor="#ffffff" leftmargin="5" topmargin="1" marginheight="5" marginwidth="5">
<div align=center> 
  <table border=0 cellpadding=0 cellspacing=0 width=680 align="center">
    <tbody> 
    <tr> 
      <td width=200 height="59"> 
         
    </tr>
    </tbody> 
  </table>
  <table border=1 bordercolordark=#ffffff bordercolorlight=#ffffff cellpadding=0 
cellspacing=0 width=685 align="center" height="70">
    <tbody> 
    <tr> 
      <td bgcolor=#F9D23C height=14> 
        <div align=center class=H1> <b><strong><b><font face="幼圆" size="3"><span class="unnamed1">C++Builder 
          中动态库的链接问题</span></font></b></strong></b></font></div>
      </td>
    </tr>
    <tr valign=top> 
      <td class=H1 height=212> 
        <p align="right">  转载自《电脑报》 
          (文/)</span></font></p>
        <p>  &nbsp;&nbsp;&nbsp; 动态库链接到应用程序中主要有两种方式:隐式链接和显式链接。隐式链接是常用方式。 
          </span></font></p>
        <p>    如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains 
          invalid OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。 
          </span></font></p>
        <p>    显式连接:显式连接不需要在工程中加入导入库和相应的头文件,只需要把动态库放入指定的目录下。在应用程序中通过函数调用显式的装载和卸掉DLL,通过函数指针来调用DLL的导出函数。 
          </span></font></p>
        <p>    步骤: </span></font></p>
        <p>    1. 调用LoadLibrary函数装载DLL并得到模块句柄; 
          </span></font></p>
        <p>    2. 调用GetProcAddress函数获取指定导出函数的指针; 
          </span></font></p>
        <p>    3. 用这个函数的指针调用该函数; </span></font></p>
        <p>    4. 使用完毕后,用FreeLibrary释放DLL。 
          </span></font></p>
        <p>    例子: </span></font></p>
        <p>    用VC++制作一个动态库: </span></font></p>
        <p>    选new→Project→Win32—Dynamic—Link 
          Library,加入addit.cpp </span></font></p>
        <p>    extern ″C″ </span></font></p>
        <p>    { void —declspec( dllexport 
          ) addit(int a, int b, int *c) </span></font></p>
        <p>    { *c = a + b; </span></font></p>
        <p>     } </span></font></p>
        <p>    } </span></font></p>
        <p>    addit.h </span></font></p>
        <p>    extern ″C″ </span></font></p>
        <p>    {void addit(int a, int 
          b, int *c);} </span></font></p>
        <p>    编译链接生成addit.dll和addit.lib。在C++Builder程序中调用addit函数。 
          </span></font></p>
        <p>    C++Builder程序中: </span></font></p>
        <p>    {HINSTANCE handle; //DLLa模块的句柄 
          </span></font></p>
        <p>     FARPROC lpFarProc; 
          </span></font></p>
        <p>    void (*lpaddit)(int,int,int 
          *); </span></font></p>
        <p>  //指向addit函数的指针 </span></font></p>
        <p>    int ntemp; </span></font></p>
        <p>    handle = LoadLibrary(″addit.dll″); 
          </span></font></p>
        <p>    //装载addit.dll, 得到该库句柄 
          </span></font></p>
        <p>    //addit.dll位于当前目录下 </span></font></p>
        <p>    lpFarProc = GetProcAddress(handle,″addit″); 
          </span></font></p>
        <p>    //得到指向函数addit的指针 </span></font></p>
        <p>    lpaddit = (void(—cdecl 
          *)(int, int, int *))lpFarProc; //指针类型转换 </span></font></p>
        <p>    lpaddit(2,3,&ntemp); 
          //使用addit函数 </span></font></p>
        <p>    FreeLibrary(handle); 
          </span></font></p>
        <p>    //将addit.dll从程序中卸掉 </span></font></p>
        <p>    } </span></font></p>
        <p>    此程序在VC++ 5.0 和C++Builder 
          3.0下通过。 </span></font></p>
        <p>    使用C++Builder中提供的导入库生成工具:先预处理,后隐式链接。 
          </span></font></p>
        <p>    步骤: </span></font></p>
        <p>    1.用C++Builder提供的implib.exe工具重新生成该动态库(xxx.dll)的导入库(xxx.lib)。命令如下: 
          </span></font></p>
        <p>    implib addit.lib addit.dll。 
          </span></font></p>
        <p>    addit.dll为已有动态库,addit.lib为要生成的导入库。由此生成的导入库addit.lib格式与C++Builder开发平台是相容的; 
          </span></font></p>
        <p>    2.在动态库的头文件addit.h中,对其输出函数重新说明,语句如下: 
          </span></font></p>
        <p>     extern —stdcall void 
          addit( int a, int b, int *c); </span></font></p>
        <p>    3.然后采用隐式链接法,将重新生成的导入库(addit.lib)和重新说明的头文件(addit.h)加入到C++Builder应用程序的工程项目中,进行编译和连接。 
          </span></font></p>
        <p>    addit.dll按上述步骤操作,在VC++ 
          5.0 和C++Builder 3.0下通过。 </span></font>
         
      </td>
    </tr>
    </tbody> 
  </table>
</div>
<p align="center"><script src="../../2.js"></script></a>
</body>
</html>

⌨️ 快捷键说明

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