2010-12-12 12 views
3

私は制御できないC++プログラムによってロードされているD DLLを持っています。プログラムLoadLibrarys私のDLLとGetProcAddressを使用して1つの引数(ポインタ)を取る "extension_load"という名前の関数を見つける。私のDのDLLでは私が持っている:エクスポートされた関数シンボル名のマングリング

extern (C) int extension_load(void* ptr) { 
    return 0; 
} 

そして、この名前がextension_loadとしてエクスポートする必要がありますが、GetProcAddressが、それを見つけることができないので、それは、4 @ extension_loadとしてエクスポートされています。名前を変えずにplain_extensionにするにはどうすればいいですか?

+0

GetProcAddress *は*関数を見つけられませんか? 'extension_load @ 4 'はどこから来たのですか(つまり、この名前だったのはどうでしたか) – jpalecek

+0

@jpalecek、申し訳ありませんが、私はそれが暗示されたと思いました。 GetProcAddressはextension_loadの名前で関数を見つけることができません。 @ 4はすべての引数の長さから来ています。extension_load @ 4はデバッガでプロセスを開き、メモリ内の文字列をextension_load @ 4に変更すると、現在のところexportされていることがわかります見つかった。 –

答えて

5

エクスポートの名前を変更する.defファイルをリンカーに提供する必要があります。ドキュメントare here、あなたはEXPORTSが必要です。

+0

私はDのブランドが新しく、エクスポートの名前を変更する.defファイルをリンカーに与える方法がわかりません。私はコマンドラインオプションを知らない。 –

+0

さて、それについてもっと学び始める絶好の機会だと思います。あなたの質問は、あなたが何らかの種類のIDEを使用しているのか、手作業で構築しているのかを私が分かりやすく説明するものではありません。私がリンクしているサイトを参照すると、リンカー上のドキュメントもあります。 –

4

私はHans Passantのリンクの助けを借りて作業しました。ここでは(あまりにもおそらく自分自身を)将来的に必要になります誰のための私の.defファイルには、次のとおりです。

EXETYPE NT 

EXPORTS 
    extension_load 
    DllMain 

私が持っている.defファイルがdll.defという名前です。私は、この関数はのように書かれている:

extern (C++) int extension_load(void* ptr) { 

と私が使用するIDEはとてもプロジェクト]> [プロパティ]> [オプション]のビルドと入力しに行く、リンカにDEFファイルを与えるために、D-IDEである

nameofdef.def 

Extra Linking argumentsテキストボックスに入力します。これは、nameofdef.defファイルがD-IDEのメインプロジェクトディレクトリに存在することを前提としています。

1

実際には、defファイルは必要ありません。ただ:例えば、export

export extern (C) int extension_load(void* ptr) { 
    return 0; 
} 

をあなたの機能を付加を介してコンパイル:dmd -ofmydll.dll mydll.d。もちろん、DllMain()も定義する必要があります。

関連する問題