炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4530|回复: 0

在c++builder 中调用VC的DLL

[复制链接]
  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2012-4-13 22:23:44 | 显示全部楼层 |阅读模式
    动态库链接到应用程序中主要有两种方式:隐式链接和显式链接。隐式链接是常用方式。
    如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(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下通过。

    ---------------------------------------------------------------------------
    以上资料来源于网络

    相关帖子

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-4-26 14:13 , Processed in 0.072444 second(s), 22 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表