• [转]VC和c++ builder DLL互调用


    常在江湖飘,少不了要和DLL打交道。有时我们需要使用C++Builder编写一个DLL,然后拿到VC中用(比如用C++Builder写一个窗体封装到DLL);有时又要拿VC编写的DLL在C++Builder使用(比如拿到一个产品的开发包,这个包是一堆用VC写的DLL)。
    很遗憾,由于MS和Borland(CodeGear)两家的编辑器实现细节不同,造成了它们生成的DLL不能相互通用,因此给实际带来了很多的麻烦。下面来说一说如何解决这个问题。
    一、VC生成DLL,C++Builder调用。
    1、用extern "C"修饰VC导出的DLL函数。如:extern "C" __declspec(dllexport) int aFunc(int a);
    2、用C++Builder的implib工具生成DLL对应的lib文件。如:implib -a xxx.lib xxx.dll(注意,implib一定要带-a开关)。生成lib文件之后,C++Builder便可以使用这个lib文件了。

    二、C++Builder生成DLL,VC调用。
    1、用extern "C"修饰C++Builder导出的DLL函数。如:extern "C" __declspec(dllexport) int aFunc(int a);
    2、用C++Builder的impdef工具生成DLL对应的def文件。如:impdef xxx.def xxx.dll。
    3、用记事本打开xxx.def文件,删去每个函数名前的"_"。如原来的def文件为:
    C/C++ code
    LIBRARY XXX.DLL EXPORTS ___CPPdebugHook @2 ; ___CPPdebugHook _aFunc @1 ; _aFunc

    那么删除后就变成了:
    C/C++ code
    LIBRARY XXX.DLL EXPORTS __CPPdebugHook @2 ; ___CPPdebugHook aFunc @1 ; _aFunc

    4、用VC的LIB工具,根据上面的def文件生成lib文件。如:LIB /DEF:XXX.def。生成lib文件之后,VC便可以使用这个lib文件了。

    综上说来,两种工具开发的DLL在相互使用的时候,主要的问题便是lib库的问题,能把这一问题解决好行了。
  • 相关阅读:
    十问5.12汶川大地震
    JZ035数组中的逆序对
    JZ037数字在排序数组中出现的次数
    JZ039平衡二叉树
    JZ033丑数
    JZ040数组中只出现一次的数字
    JZ032把数组排成最小的数
    JZ036两个链表的第一个公共结点
    JZ034第一个只出现一次的字符位置
    JZ031从 1 到 n 整数中 1 出现的次数
  • 原文地址:https://www.cnblogs.com/adylee/p/1961545.html
Copyright © 2020-2023  润新知