0

クラスを含む Hunspell DLL を VC++ でコンパイルしました...今度は 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(...); を出し続ける場合です。 ' から参照....

Builder C++ で VC++ dll を呼び出す正確な方法は何ですか? みなさん、よろしくお願いします...

乾杯、ルイジーノ

4

1 に答える 1

0

最初に、 DLL#includeのインポート ヘッダー ファイルを作成する必要があります(クラス、consts 定義などを含む)。

その後、次の 2 つの方法があります。

  1. 静的 DLL リンク

    簡単ですが、 MSVC++ DLL では動作しないことがあります。Borland bin フォルダーのimplib.exeで作成できるDLL用のLIBファイルをプロジェクトに追加する必要がありますが、ビルダーがすべての外部を解決できるまで、使用されたマングリングを修正するためにコマンド ライン スイッチをいじる必要があります。例えば:

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

    lib ファイルが正しくない場合、コンパイラは未解決の外部エラーを追加します。また、 MSVC++のobj/libファイルは、MS が標準外の形式を使用するため、Borland/Intel と互換性がありません。そのような場合、Borland は間違った OMFのようなことを叫ぶので、implibユーティリティは

  2. ダイナミック DLL リンク

    以下の例では、 DLLから 2 つの関数をリンクしています。クラスをリンクするには、インポートするすべてのクラスのすべての使用済みメソッドをリンクする必要があります。また、DLL での名前マングリング(静的リンクと同様) に問題がある可能性があるため、いくつかのツールを使用して dll を探索します (私はDLL Export Viewer を使用します) 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
    {
    ...
    };

PS

MSVC++Borlandの間でAPIを構築する際は、ブース プラットフォームで使用されていない非標準のデータ型の使用を避けるために、何をエクスポート/インポートするかに注意してください (または、などと同じ方法で)。AnsiString

于 2013-08-03T08:10:52.480 に答える