2009-03-23 4 views
4

これは興味深い問題です。私は、明らかに、ソースがない独占的なdllのセットを使って作業しています。目標は、独自のdllからの一連のファンクションコールをグループ化する中間dllを作成することです。私が持っている問題は、g ++でコンパイルすると、元のDLLの行に沿ってエラーが発生することです。 libname_NULL_THUNK_DATAをエクスポートできません。記号が見つかりません。別のdllにアクセスするdllをコンパイルするのに問題があります

実行ファイルにメインファイルを追加してコンパイルするだけで、すべてが正常に動作します。私はコンパイルのためにmingwを使用しています。助けてくれてありがとう。

最初の返信に応じて:あなたが言っていることについて私は混乱しているか、私は自分の質問をうまく言いませんでした。私は明示的にラッパーから何かをエクスポートしようとしていません、私はDLLから関数を呼び出すだけです。問題は、これらの特定のシンボルをDLLからラッパーにエクスポートできないというエラーが発生することです。問題は、これらの_NULL_THUNK_DATAシンボルが何であるか完全にはわからないということです。私は検索を行い、ウィンドウが使用する内部シンボルなので、エクスポートしないでください。私はリンカーに--exclude-symbolsディレクティブを使用しようとしましたが、何もしていないようです。あなたが何を言おうとしているのかを完全に誤解していたら謝ります。

私の問題はこれに関連していたと思います。ちょうど私が例えば関数を呼び出す直接ヘッダを含めるとすることができたDLLを使用して、標準の実行可能ファイルをコンパイルする場合:

#include :3rdparty.h 
int main(){ 
    dostuff(); // a function in the 3rdparty.dll 
} 

これは、コンパイルして罰金実行します。私はg ++コマンドでライブラリをリンクする必要がありました。 -sharedフラグを使用してリンクすると、これらのエラーが発生します(もちろんメインは削除されています)。私は、デフォルトでg ++がdllからすべてのシンボルをインポートしようとしているという事実と関係があると思います。私が理解できなかったのは、これがdllと実行可能ファイルの間で起こる理由です。私はGetProcAddress()を使ってやってみます。ありがとうございました!

答えて

0

「コンパイル」は、間違ったところからこれに近づいていることを示しています。 DLLは独自のラッパー関数をエクスポートするのではなく、他のDLLからのエクスポートを直接参照する必要があります。

など。 Windows Kernel32.DEFファイルには、次のフォワードが存在します。

 
    EXPORTS 
    ... 
    HeapAlloc = NTDLL.RtlAllocHeap 

HeapAlloc関数のコードはありません。

2

それはそうすべきだと思います。

例: あなたのdllのコードが必要:

void doStuff() 
{ 
    3rdparty.login(); 
    3rdparty.dostuff(); 
    3rdparty.logoff(); 
}; 

これまでのところ - ので、良い、あなたは右のヘッダを含めました....(あなたがそれらを持っている場合あなたがいない場合、あなたが必要LoadLibrary()を使用してライブラリをインポートし、GetProcAddress()を使用してエクスポートされた各dllエントリポイントに関数ポインタを作成し、その関数ポインタを呼び出す)

次に、サードパーティのlibにリンクしている。場合によっては、リンケージ名のマングリングを正しくするために、 'extern "C"'で定義をラップする必要があります。

g ++を使用していると言えば、MS VC拡張機能である__declspec(dllimport)と混乱することはありません。

関連する問題