0

C++ DLL を、これから作成する新しい C++ DLL にリンクしようとしています。

以下のチュートリアルと他の多くのチュートリアルを順を追って実行しましたが、「GetProcAddress」関数が NULL を返す「http://www.dreamincode.net/forums/topic/118076-dlls-explicit-linking/

これは、DLL から呼び出そうとする関数のプロトタイプです。

int RemoveAllDataFile( unsigned int id );

関数は 1 を返すため、DLL は正常にロードされます。

typedef int (*funcRemoveAllDataFile) (int);

int load_dll_ARbnet(int x)
{
    /* Retrieve DLL handle.*/
    HINSTANCE hDLL = LoadLibrary("ArbNet2Remote.dll");   
    if (hDLL == NULL)
    {
        return 0;
    }    
    else
    {
    }
    /*Get the function address*/
    funcRemoveAllDataFile RemoveAllDataFile = (funcRemoveAllDataFile)GetProcAddress(hDLL, "RemoveAllDataFile");
    if (RemoveAllDataFile)
    {
        return 2;
    }
    else
    {
        return 1;
    }

}

4

2 に答える 2

0

TDUMP などのレポート ツールを使用して、DLL の実際のエクスポートを確認します。探している関数は"RemoveAllDataFile"、期待どおりにエクスポートされていません。実際には"_RemoveAllDataFile"、代わりに、またはのようにエクスポートされてい"_RemoveAllDataFile@4"ます。

元の DLL をコンパイルしていて、関数を としてエクスポートする"RemoveAllDataFile"場合は、エクスポートされた関数の宣言を でラップしてextern "C"、エクスポートされた名前から C++ 名マングリングを削除する必要があります。C++ コンパイラによっては、ファイルを使用して、呼び出し規約.defによって課される先頭のアンダースコアを削除する必要がある場合もあります。__cdeclC リンケージを使用する場合、一部の C++ コンパイラ__cdeclは先頭にアンダースコアを付けて関数をエクスポートします (Borland など) と、そうでないもの (Microsoft など) があります。

ただし、元の DLL を再コンパイルしない場合は、DLL のエクスポートを調べて、GetProcAddress()実際にエクスポートされている適切な名前を使用するように呼び出しを変更するしかありません。

于 2015-02-16T18:29:18.587 に答える