1

DLLに次の構造体の定義があるとしましょう。

typedef struct {
    double varOne;
    double varTwo;
} structOne;

structOne myStruct;

その後、DLLをロードするメインアプリケーションから次のこと実行できます。

structOne * sPtr = (structOne *)GetProcAddress(libraryHandle, "myStruct");

私の質問は次のようなことを行うことが可能かどうかです。

double * dPtr = (double *)GetProcAddress(libraryHandle, "myStruct.varOne");
  • あなたが私が欲しいものを理解し、それが可能であるならば; 構文は何ですか?
  • それが不可能な場合; なぜ?
  • あなたが私の質問を理解していない場合; コメントでそう言ってください!

よろしく、答えを期待しています!

4

4 に答える 4

3

いいえ、これは不可能です。GetProcAddress動的リンカー情報にのみアクセスできます。クラス/構造のレイアウトに関する情報は、コンパイラ情報の一部です。コンパイラは、この情報を PDB ファイルに配置します。バイナリ モジュールには直接存在しません。GetProcAddressEXE/DLL ファイルに保存されている情報にのみアクセスできます。PDB ファイルは主にデバッガーによって使用されますが、StackWalk.

于 2012-06-26T11:05:21.250 に答える
1

実際のところ、GetProcAddressを使用してアクセスできる関数(シンボル)は、エクスポートアドレステーブルによってエクスポートされたもののみであるため、これは不可能です。

于 2012-06-26T11:07:48.800 に答える
1

他の回答で述べたように、これは不可能です。

問題を解決するには、DLL から構造体定義をエクスポートし、グローバル変数のアドレスを返すグローバル関数をエクスポートします。exe からこの関数をインポートし、これを呼び出して、dll で定義されたグローバル構造体オブジェクトへのポインターを取得します。コードは続きます...

structOne.h ファイルを追加し、構造定義をそのファイルに移動します。定義を次のように変更します

#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif

struct TESTDLL_API structOne{
    double varOne;
    double varTwo;
} ;

C++ プリプロセッサ マクロ TESTDLL_EXPORTS を DLL に追加します。

structOne.cpp ファイルでこのようなグローバル関数を定義し、それもエクスポートします。

structOne myStruct; // your global variable

TESTDLL_API structOne* getStruct(){return &myStruct;}

次に、DLL をビルドします。

.exe から、次のコードを使用してメソッドを呼び出します。また、structOne.h ヘッダー ファイルをインクルードします。

typedef structOne* (*getStruct)();

HMODULE libraryHandle = ::LoadLibraryA("TestDLL.dll");
getStruct fn = (getStruct)::GetProcAddress(libraryHandle, "getStruct");
structOne* s = (*fn)();
于 2012-06-26T11:18:45.710 に答える
0

オフセット自体 (0) は暗黙的に DLL に存在しますが、そのオフセット ( ) に対応するシンボル".varOne"は存在しません。

回避策:

struct member_t { char const* type; char const* member; size_t offset };
#define MEMBER(T, M) {#T, #M, offset_of(T, M) }
member_t exports[] = {
  MEMBER(myStruct, varOne)
};
于 2012-06-26T12:22:50.347 に答える