Builder C ++调用VC ++类

时间:2012-10-29 14:36:35

标签: c++builder c++builder-2006

我用VC ++编译了一个包含类的Hunspell DLL ... 现在我想在Builder C ++ 2006中调用该DLL来使用它的函数......我怎么能这样做?

我尝试过:

typedef Hunspell * (CALLBACK *fpoint)(char *aff_file, char *dict_file);
fp pHunspell = (fp)GetProcAddress(handle_Hunspell, "hunspell_initialize");
if (pHunspell) {
  Hunspell* obj = (Hunspell *)pHunspell("..\hunspelldic\en_US.aff", "..\hunspelldic\en_US.dic");
  obj->add_dic("..\hunspelldic\it_IT.aff", "..\hunspelldic\it_IT.dic");
}

问题是如果在BuilderC ++ 2006中我可以在按下shift-space之后显示函数obj->但看起来它并没有真正识别类函数,并且它不断发出未解析的外部'__fastcall Hunspell :: add_dic(...);'引自....

将VC ++ dll调用到Builder C ++的确切方法是什么?在此先感谢大家...

干杯, Luigino

1 个答案:

答案 0 :(得分:0)

首先,您必须#include DLL 的导入头文件(包括类,consts定义...)

之后有两种方式:

  1. 静态DLL链接

    很简单,但有时不适用于 MSVC ++ DLL 。您需要添加为 DLL LIB 项目,您可以使用Borland bin文件夹中的 implib.exe 创建,但您可能必须使用命令行切换以纠正转换使用的修改,直到构建器可以解析所有外部。例如:

    implib.exe -c -f -a glut32.lib glut32.dll 
    

    如果你有不正确的lib文件,那么编译器会添加你未解决的外部错误。此外,来自 MSVC ++ obj / lib 文件与Borland / Intel不兼容,因为MS使用其非标准格式。在这种情况下,Borland会大喊错误的OMF ,因此 implib 实用程序

  2. 动态DLL链接

    在示例中,我链接了 DLL 中的2个函数。对于链接类,您必须链接导入的所有类的所有已使用方法。你也可能在DLL中名称修改(类似于静态链接)有问题,所以使用一些工具来探索dll (我使用DLL导出查看器),它显示了真正的功能您必须在GetProcAddress中使用的 DLL 中的名称。这是一个例子:

    HANDLE hdll;
    typedef BOOL(__stdcall *_InitRemoteCtrl)(HWND); _InitRemoteCtrl InitRemoteCtrl;
    typedef DWORD(__stdcall *_ReadRemoteData)();    _ReadRemoteData ReadRemoteData;
    
    __fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
        {
        hdll=LoadLibrary("./RemtCtrl.dll");
        if (hdll==0) Application->Terminate();
        InitRemoteCtrl=(_InitRemoteCtrl)GetProcAddress(hdll,"InitRemoteCtrl");
        ReadRemoteData=(_ReadRemoteData)GetProcAddress(hdll,"ReadRemoteData");
        }
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
        {
        FreeLibrary(hdll);
        }
    
  3. 如果可以,请使用第一个选项,因为它更安全。另外,请不要忘记在 DLL 头文件导出中为 DLL 源导出/导入类,并导入 DLL 用法。

    class __declspec(dllimport/dllexport) myClass
        {
        ...
        };
    

    <强> PS

    MSVC ++ Borland 之间构建 API 时,请注意导出/导入的内容,避免使用未在展位中使用的非标准数据类型平台(或与AnsiString,...)相同的方式。