0

「CPPLoadLibrary」の例 (Microsoft All-in-One フレームワークから) を使用しました。サンプル DLL からシンボルをエクスポートするには 2 つの方法があります。

  1. .DEF ファイルを使用して DLL からシンボルをエクスポートする モジュール定義 (.DEF) ファイルは、DLL のさまざまな属性を記述する 1 つまたは複数のモジュール ステートメントを含むテキスト ファイルです。.DEF ファイルを作成し、DLL のビルド時に .def ファイルを使用します。このアプローチを使用すると、名前ではなく序数によって DLL から関数をエクスポートできます。
  2. __declspec(dllexport) を使用して DLL からシンボルをエクスポートする __declspec(dllexport) はエクスポート ディレクティブをオブジェクト ファイルに追加するため、.def ファイルを使用する必要はありません。この便利さは、装飾された C++ 関数名をエクスポートしようとするときに最も顕著になります。

そして、次のコードがあります。

typedef int     (_cdecl* LPFNGETSTRINGLENGTH1)      (PCWSTR);
typedef int     (CALLBACK* LPFNGETSTRINGLENGTH2)    (PCWSTR);

LPFNGETSTRINGLENGTH1 lpfnGetStringLength1 = (LPFNGETSTRINGLENGTH1) 
    GetProcAddress(hModule, "GetStringLength1");

LPFNGETSTRINGLENGTH2 lpfnGetStringLength2 = (LPFNGETSTRINGLENGTH2) 
    GetProcAddress(hModule, "_GetStringLength2@4");

だから私の質問は、GetProcAddress を呼び出すためにシンボルの名前を決定する方法ですか? 最初のケースでは、.DEF ファイルからそのシンボル名を取得します。しかし、"_GetStringLength2@4" はどうでしょうか? アンダースコアとは何ですか? 「@4」は何の略ですか?ありがとう。

4

2 に答える 2