5

C++ アプリで使用する lib またはヘッダー ファイルのないサード パーティの dll があります。そのため、 LoadLibrary(_T("xxx.dll")) を使用してロードします。そして、GetProcAddress() 関数でその関数に到達できます。

この dll には構造体があり、私もそれに到達する必要があります。到達して使用するにはどうすればよいですか? 私はサイトを見てきましたが、c++ ではなく c# の例だけを見つけました。C ++でこれを行う方法は何ですか?

ありがとう...

4

2 に答える 2

2

簡単な回答: GetProcAddress を使用して、構造体として宣言された変数のアドレスを取得できます。GetProcAddress のマニュアル ページから:

指定されたダイナミック リンク ライブラリ (DLL) から、エクスポートされた関数または変数のアドレスを取得します。

その関数の名前は、GetProcAddress ではなく GetSymAddress にする必要がありますが、余談になります。

長い答え:

DLL にstruct Foo 型のシンボルインスタンスが含まれているとします。

typedef struct { int x; int array[100]; } Foo;
__declspec( dllexport )  struct Foo Bar = 
{
0xdeadbeef,{0}
};

dll をロード済みで、その hModule ハンドルがどこかにある場合は、変数Barのアドレスを取得できます。

struct Foo* Bar = GetProcAddress(hModule,"Bar");

構造自体の定義を取得することはできませんが、とにかくそれが意図したものではないと思います。

注: 名前マングリング、extern "C" 宣言、および要点を明確にするために考慮する必要があるその他の事項を見落としています。読者は、目前のトピックの基本的な内容を既に把握していると思います。

于 2016-09-07T17:39:31.953 に答える
1

たとえば C# 定義から構造体の構文がわかっている場合は、その定義を .h ファイルに追加し、それを C++ ソース ファイルに含めて使用するだけです。それで全部です。ただし、構造体がある種のクラスであり、メンバー メソッドがある場合は、メンバー メソッドの装飾名を知っている必要があります。それらを .dll から動的にロードし、C 関数として呼び出します。

于 2012-09-25T16:37:17.620 に答える