DLL과 리소스 C++

- 퍼옴(출처) : http://dozob.springnote.com/pages/1925130


DLL은 독립적으로 자신의 리소스를 가질 수 있고, 이를 사용할 수 있다.

DLL은 자신을 호출한 EXE가 갖고 있는 리소스를 참조할 수 있고,
EXE는 DLL이 가지고 있는 리소스를 참조할 수 있다.

 

  1. void AfxSetResourceHandle(HINSTANCE hInstance);
  2. HINSTANCE AfxGetResourceHandle();
  3. HMOUDLE GetMoudleHandle(LPCTSTR lpModuleName);
  • EXE와 DLL은 모두 default로 자기 자신의 인스턴스를 이용하여 리소스 참조
  • DLL의 인스턴스 핸들 얻기

    • 명시적 연결을 사용할 경우 LoadLibrary()
    • 암시적 연결을 사용할 경우 GetModuleHandle()
  • DLL에서 자기 자신을 호출한 EXE의 인스턴스 핸들 얻기

    1. (HANDLE)GetModuleHandle(NULL);

 

대화상자를 출력하는 DLL

 

Extention DLL 이용
  1. /* in Extension DLL */
  2. #include "Resource.h"
  3. ;
  4. class AFX_EXT_CLASS CMyDlg : public CDialog
  5. {
  6.     ;
  7. };
  8. /* in EXE */
  9. #include "../MyDll/MyDlg.h"
  10. ;
  11. // 일반 클래스처럼 사용

 

Regular DLL 이용
  1. /* in Regular DLL */
  2. #include "MyDlg.h"
  3. ;
  4. extern "C" __declspec(dllexport) void ShowDlg()
  5. {
  6.     // DLL이 자기 자신의 인스턴스 핸들을 이용하여
  7.     // 리소스를 올바로 참조할 수 있도록 초기화
  8.     // MFC 라이브러리를 DLL로 링크하는 경우 반드시 호출해야 함
  9.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  10.     ;
  11.     CMyDlg myDlg;
  12.     myDlg.DoModal();
  13. }
  14. /* in EXE */
  15. // Import 라이브러리를 프로젝트에 포함 시켜야 함.
  16. extern "C" __declspec(dllimport) void ShowDlg();
  17. // 전역 함수와 같이 사용

 

EXE에서 DLL의 리소스 참조

 

명시적 연결
  1. class CMyExeApp : public CWndApp
  2. {
  3.     ;
  4.     HINSTANCE m_hMyDll;
  5. }
  6. BOOL CMyExeApp::InitInstance()
  7. {
  8.     ;
  9.     if ( (m_hMyDll = LoadLibrary("MyDll.dll") == NULL )
  10.     {
  11.         AfxMessageBox("Cannot find the MyDll.dll file.");
  12.     }
  13.     return TRUE;
  14. }
  15. int CMyExeApp::ExitInstance()
  16. {
  17.     FreeLibrary(m_hMyDll);
  18.     return CWndApp::ExitInstance();
  19. }
  20. #include "../MyDll/Resource.h"
  21. void CMyExeApp::ShowMyDllResource()
  22. {
  23.     HINSTANCE hDefault = AfxGetResourceHandle();
  24.     AfxSetResourceHandle(m_hMyDll);
  25.     CString strDllRes;
  26.     strDllRes.LoadString(IDS_DLLSTRING);
  27.     AfxSetResourceHandle(hDefault);
  28.     AfxMessageBox(strDllRes);
  29. }

 


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://itbaby.egloos.com/tb/4676900 [도움말]

덧글

댓글 입력 영역