GetProcAddressGetProcAddress

プロセスに DLL を明示的にリンクする場合は、GetProcAddress を呼び出して、DLL 内のエクスポート関数のアドレスを取得します。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 のパラメーターには、LoadLibraryAfxLoadLibrary、または GetModuleHandle のいずかによって返された DLL モジュール ハンドルと、呼び出す関数の名前またはエクスポート序数を渡します。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 ファイルの EXPORTS セクション内の関数に序数が付けられている場合だけです。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. 指定された名前を DLL のエクスポート テーブル内の関数名と比較するのではなく、エクスポート序数を使うと、GetProcAddress ではその関数をすぐに発見できます。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. ただし、エクスポート序数を使って GetProcAddress を呼び出すには、.def ファイル内でエクスポート関数に対して割り当てられている序数を知っている必要があります。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