网站首页 | 网页制作 | 网络编程 | 图形图象 | 冲浪宝典 | 操作系统 | 软件教学 | 网络安全 | 认证考试 | 下载中心 | 游戏下载
| 网络编程首页 | ASP | ASP.NET | PHP | JSP | C# | Delphi | Java | C/C++ | XML | SMS | VC | VB | 数据库 |
您现在的位置: 超人气学院 >> 网络编程 >> CC++ >> 文章正文 用户登录 新用户注册
C++Builder中动态库的链接问题           
C++Builder中动态库的链接问题
作者:未知 文章来源:网络收集 点击数: 更新时间:2006-3-10 11:13:57

C++Builder中动态库的链接问题
   动态库链接到应用程序中主要有两种方式:隐式链接和显式链接。隐式链接是常用方式。
 如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(lib文件)可能会与应用程序的开发平台所要求的导入库格式不相容,从而在应用程序与动态库隐式链接时,出现程序链接错误:contains invalid OMF record。例如在C++Builder开发平台上链接Visual C++制作的动态库时,就会出现上述的错误。解决这一问题,可以采用两种方法:显式连接法和使用C++Builder中提供的导入库生成工具。

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

  步骤:

  1. 调用LoadLibrary函数装载DLL并得到模块句柄;
  2. 调用GetProcAddress函数获取指定导出函数的指针;
  3. 用这个函数的指针调用该函数;
  4. 使用完毕后,用FreeLibrary释放DLL。

  例子:

  用VC++制作一个动态库:

  选new→Project→Win32―Dynamic―Link Library,加入addit.cpp

  extern ″C″

  {
    void  __declspec( dllexport ) addit(int a, int b, int *c)

   {
      *c = a + b;

   }

  }

  addit.h

  extern ″C″

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

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

  C++Builder程序中:

  {
    HINSTANCE handle; //DLLa模块的句柄
  FARPROC lpFarProc;
  void (*lpaddit)(int,int,int *);//指向addit函数的指针
  int ntemp;
  handle = LoadLibrary(″addit.dll″); //装载addit.dll, 得到该库句柄 addit.dll位于当前目录下
  lpFarProc = GetProcAddress(handle,″addit″);   //得到指向函数addit的指针
  lpaddit = (void(__cdecl *)(int, int, int *))lpFarProc; //指针类型转换
  lpaddit(2,3,&ntemp); //使用addit函数
  FreeLibrary(handle); //将addit.dll从程序中卸掉
  }

  此程序在VC++ 5.0 和C++Builder 3.0下通过。
  使用C++Builder中提供的导入库生成工具:先预处理,后隐式链接。
  步骤:

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

  implib addit.lib addit.dll。

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

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

   extern __stdcall void addit( int a, int b, int *c);

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

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

[ 收藏此页到: 天天|和讯|博采|ViVi|狐摘|我摘|天极 ] 文章录入:kinda    责任编辑:kinda 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
     链接错误unresolved[664]
    相 关 文 章
    利用VC++6.0实现JNI的最简
    i = i++;
    Borland JBuilder + BEA W
    WEBLOGIC+ORACLE+JBUILDER
    WEBLOGIC+ORACLE+JBUILDER
    JAVA和C++区别
    如何在C/C++中调用Java
    JAVA与C++对对象数组的不同
    Java与c及c++的比较
    DifferencebetweenJava&am
    PerformancecomparisonC++
    java和c++比较(1)--虚函数
    java与c/c++进行socket通信
    int i=0;i=i++;i=?//简单问
    java与c/c++进行socket通信
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)