GetProcAddressGetProcAddress

Dll に明示的にリンクしているプロセスは、DLL 内のエクスポートされた関数のアドレスを取得するためにGetProcAddressを呼び出します。Processes explicitly linking to a DLL call GetProcAddress to obtain the address of an exported function in the DLL. 返された関数ポインターを使って、DLL 関数を呼び出します。You use the returned function pointer to call the DLL function. GetProcAddressは、DLL モジュールハンドル ( LoadLibraryAfxLoadLibrary、またはGetModuleHandleのいずれかによって返される) のパラメーターとしてを受け取り、呼び出す関数の名前または関数のエクスポート序数を受け取ります。GetProcAddress takes as parameters the DLL module handle (returned by either LoadLibrary, AfxLoadLibrary, or GetModuleHandle) and takes either the name of the function you want to call or the function's export ordinal.

DLL 関数の呼び出しにはポインターが使われ、コンパイル時にデータ型はチェックされないため、関数へ渡すパラメーターが正しいことを確認してください。パラメーターが不正な場合、スタック上に割り当てられたメモリ域をオーバーしたり、アクセス違反を起こしたりすることがあります。Because you are calling the DLL function through a pointer and there is no compile-time type checking, make sure that the parameters to the function are correct so that you do not overstep the memory allocated on the stack and cause an access violation. 型をタイプセーフにする 1 つの方法は、エクスポート関数の関数プロトタイプを見て、関数ポインター用に対応する typedef を作成することです。One way to help provide type-safety is to look at the function prototypes of the exported functions and create matching typedefs for the function pointers. 例えば:For example:

typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
DWORD dwParam1;
UINT  uParam2, uReturnVal;

hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
   if (!lpfnDllFunc1)
   {
      // handle the error
      FreeLibrary(hDLL);
      return SOME_ERROR_CODE;
   }
   else
   {
      // call the function
      uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
   }
}

GetProcAddressを呼び出すときに必要な関数を指定する方法は、DLL のビルド方法によって異なります。How you specify the function you want when calling GetProcAddress depends on how the DLL was built.

リンク先の DLL がモジュール定義 (.def) ファイルでビルドされている場合、および DLL の .def ファイルのexportセクションの関数と共に序数が列挙されている場合にのみ、エクスポート序数を取得できます。You can only obtain the export ordinal if the DLL you are linking to is built with a module definition (.def) file and if the ordinals are listed with the functions in the EXPORTS section of the DLL's .def file. 関数名ではなく、エクスポート序数を使用してGetProcAddressを呼び出すと、エクスポート序数が dll のエクスポートテーブルへのインデックスとして機能するため、dll にエクスポートされた関数が多数ある場合は、少し高速になります。Calling GetProcAddress with an export ordinal, as opposed to the function name, is slightly faster if the DLL has many exported functions because the export ordinals serve as indexes into the DLL's export table. エクスポート序数では、 GetProcAddressは、指定された名前を DLL の export テーブル内の関数名と比較するのではなく、関数を直接検索できます。With an export ordinal, GetProcAddress can locate the function directly as opposed to comparing the specified name to the function names in the DLL's export table. ただし、.def ファイル内のエクスポートされた関数に序数を割り当てることを制御できる場合にのみ、エクスポート序数を指定してGetProcAddressを呼び出す必要があります。However, you should call GetProcAddress with an export ordinal only if you have control over assigning the ordinals to the exported functions in the .def file.

実行する操作What do you want to do?

さらに詳しくは次のトピックをクリックしてくださいWhat do you want to know more about?

関連項目See also

Visual Studio での C/C++ Dll の作成Create C/C++ DLLs in Visual Studio