次の方法で共有


AfxLoadLibrary

DLL モジュールをマップするために AfxLoadLibrary を使用します。

HINSTANCE AFXAPI AfxLoadLibrary( 
   LPCTSTR lpszModuleName  
);

パラメーター

  • lpszModuleName
    モジュールの名前を含む null で終わる文字列へのポインター (.DLL または実行可能ファイル)。 指定した名前は、モジュールのファイル名です。

    文字列がパスを指定しても、ファイルは、指定したディレクトリに存在しない場合、この関数は失敗します。

    パスを指定せずに、拡張子を省略すると、既定の拡張子は .DLL 付けられます。 ただし、ファイル名の文字列) で区切ります。モジュール名に拡張子がないことを示すために、後続の文字を含めることができます。 パスを指定しない場合、関数は次の順序でファイルの検索:

    • アプリケーションが読み込んだディレクトリ。

    • 現在のフォルダー。

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

    • Windows NT only: 16 ビット Windows のシステム ディレクトリ。 このフォルダーへのパスを取得し、検索する Win32 関数はありません。 このディレクトリの名前はシステムです。

    • Windows ディレクトリ。

    • PATH 環境変数で指定されているディレクトリ。

戻り値

関数が成功した場合、戻り値はモジュールへのハンドルです。 関数が失敗した場合、戻り値は null です。

解説

これは、DLL 関数のアドレスを取得するに GetProcAddress に使用できるハンドルを返します。 またAfxLoadLibrary が別の実行可能モジュールをマップするために使用できます。

各プロセスは、それぞれの読み込まれたライブラリ モジュールの参照カウントを保持します。 この参照カウントが AfxLoadLibrary は常にデクリメントされた AfxFreeLibrary 呼び出される呼び出され、であるたびにインクリメントされます。 参照カウントがゼロに達すると、モジュールは、呼び出し元プロセスのアドレス空間から未割り当てになく、ハンドルは無効になります。

アプリケーションで複数のスレッドを使用する場合は、動的に拡張 DLL を読み込んだら AfxLoadLibraryAfxFreeLibrary を使用してください (Win32 関数の LoadLibraryFreeLibraryは機能します)。 AfxLoadLibraryAfxFreeLibrary を使用して拡張 DLL に読み込まれ、アンロードされるグローバルな MFC の状態を破損しない場合に実行されるスタートアップ コードと終了することを保証します。

アプリケーションの AfxLoadLibrary を使用して動的に DLL バージョンの MFC にリンクする必要があります。; 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 マクロとグローバル