次の方法で共有


AfxLoadLibrary

DLL モジュールを割り当てるには、AfxLoadLibrary を使用します。

HINSTANCE AFXAPI AfxLoadLibrary(
   LPCTSTR lpszModuleName 
);

パラメーター

  • lpszModuleName
    モジュール (.DLL または .EXE ファイルのどちらか) の名前が入っている NULL で終わる文字列へのポインター。 指定された名前は、モジュールのファイル名です。

    文字列にパスが含まれているにもかかわらず、ファイルが指定されたフォルダーに存在しない場合、関数は失敗します。

    パスもファイル名の拡張子も指定されていない場合、既定の拡張子の .DLL が付加されます。 ただし、ファイル名文字列は、モジュール名に拡張子がないことを示すピリオド文字 (.) を含めることができます。 パスが指定されない場合、関数は、以下の順番でファイルを検索します。

    • アプリケーションが読み込まれたフォルダー。

    • 現在のフォルダー。

    • **Windows 95/98:**Windows システム フォルダー。 **Windows NT:**32 ビット Windows のシステム ディレクトリ。 このフォルダーの名前は SYSTEM32 です。

    • **Windows NT の場合のみ:**16 ビット Windows のシステム ディレクトリ。 このフォルダーのパスを取得する Win32 関数はありませんが、検索の対象になります。 このフォルダーの名前は SYSTEM です。

    • Windows ディレクトリ。

    • PATH 環境変数に設定されているフォルダー。

戻り値

正常終了した場合は、モジュールへのハンドルを返します。 関数が失敗したときは、NULL が戻り値となります。

解説

この関数は、DLL 関数のアドレスを取得するために GetProcAddress で使用できるハンドルを返します。 AfxLoadLibrary は、他の実行モジュールを割り当てるためにも使用されます。

各プロセスは、読み込まれたライブラリ モジュールごとに参照カウントを持っています。 この参照カウントは、AfxLoadLibrary が呼び出されるたびにインクリメントされ、AfxFreeLibrary が呼び出されるたびにデクリメントされます。 参照カウントが 0 になると、モジュールが呼び出しプロセスのアドレス領域から解放され、ハンドルが無効になります。

アプリケーションでマルチスレッドを使用し、動的に拡張 DLL を読み込む場合、FreeLibrary Win32 関数および LoadLibrary Win32 関数の代わりに、必ず AfxFreeLibraryAfxLoadLibrary を使用する必要があります。 AfxLoadLibraryAfxFreeLibrary を使用することによって、拡張 DLL の読み込みまたはアンロード時に実行されるスタートアップ コードと終了コードが、グローバルな MFC の状態を破損するのを防ぎます。

アプリケーションで AfxLoadLibrary を使用すると、ユーザーは MFC の DLL バージョンへ動的にリンクする必要があります。つまり、MFC が DLL としてアプリケーションにリンクされている場合、AfxLoadLibrary のヘッダー ファイルである Afxdll_.h だけがインクルードされます。 拡張 DLL を使用または作成するには MFC の DLL バージョンにリンクを設定する必要があるため、このような仕様になっています。

使用例

// The following shows how to create a MDI based application
// using a generic CView derived class that is implemented in
// a dynamically loaded MFC Extension DLL.

typedef CRuntimeClass * (*GETDLLVIEW)();

BOOL CUserApp::InitInstance()
{
   // Standard Application Wizard generated initialization excluded.



...


   // Register the application's document templates.  Document templates
   //  serve as the connection between documents, frame windows and views

   //Load MFC Extension DLL based view class.
   m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
   if (!m_hViewDll)
   {
      CString str;
      str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
      AfxMessageBox(str);
      return FALSE;
   }

   GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
   ASSERT(GetMyView != NULL);

   CMultiDocTemplate* pDocTemplate;
   pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
      RUNTIME_CLASS(CUserDoc),
      RUNTIME_CLASS(CChildFrame), // custom MDI child frame
      GetMyView());
   if (!pDocTemplate)
      return FALSE;
   AddDocTemplate(pDocTemplate);

   // Standard Application Wizard generated initalization excluded.



...


   return TRUE;
}

int CUserApp::ExitInstance()
{
   if (NULL != m_hViewDll)
   {
      AfxFreeLibrary(m_hViewDll);
      m_hViewDll = NULL;
   }

   return CWinApp::ExitInstance();
}

必要条件

**ヘッダー:**afxdll_.h

参照

参照

AfxFreeLibrary

概念

MFC マクロとグローバル