0

我已经用 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 中,我可以在 obj-> 之后按 shift-space 后显示函数,但看起来它并不能真正识别类函数,并且它一直发出 Unresolved external '__fastcall Hunspell::add_dic(...); ' 参考自……

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

干杯,路易吉诺

4

1 回答 1

0

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

之后有两种方法:

  1. 静态 DLL 链接

    很容易,但有时不适用于MSVC++ DLL您需要为您的DLL添加项目的LIB文件,您可以在 Borland bin 文件夹中使用implib.exe创建该文件,但您可能必须使用命令行开关来正确转换使用的 mangling,直到构建器可以解析所有外部文件。例如:

    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 Export Viewer),它会向您显示DLL中您必须在GetProcAddress. 这里有一个例子:

    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);
        }
    

如果可以,请使用第一个选项,因为它更安全。也不要忘记在DLL头文件中导出/导入类,导出DLL源和导入DLL使用。

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

附言

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

于 2013-08-03T08:10:52.480 回答