- 퍼옴(출처) : http://dozob.springnote.com/pages/1925130
DLL은 독립적으로 자신의 리소스를 가질 수 있고, 이를 사용할 수 있다.
DLL은 자신을 호출한 EXE가 갖고 있는 리소스를 참조할 수 있고,
EXE는 DLL이 가지고 있는 리소스를 참조할 수 있다.
- void AfxSetResourceHandle(HINSTANCE hInstance);
- HINSTANCE AfxGetResourceHandle();
- HMOUDLE GetMoudleHandle(LPCTSTR lpModuleName);
- EXE와 DLL은 모두 default로 자기 자신의 인스턴스를 이용하여 리소스 참조
DLL의 인스턴스 핸들 얻기
- 명시적 연결을 사용할 경우 LoadLibrary()
- 암시적 연결을 사용할 경우 GetModuleHandle()
DLL에서 자기 자신을 호출한 EXE의 인스턴스 핸들 얻기
- (HANDLE)GetModuleHandle(NULL);
대화상자를 출력하는 DLL
Extention DLL 이용
- /* in Extension DLL */
- #include "Resource.h"
- ;
- class AFX_EXT_CLASS CMyDlg : public CDialog
- {
- ;
- };
- /* in EXE */
- #include "../MyDll/MyDlg.h"
- ;
- // 일반 클래스처럼 사용
Regular DLL 이용
- /* in Regular DLL */
- #include "MyDlg.h"
- ;
- extern "C" __declspec(dllexport) void ShowDlg()
- {
- // DLL이 자기 자신의 인스턴스 핸들을 이용하여
- // 리소스를 올바로 참조할 수 있도록 초기화
- // MFC 라이브러리를 DLL로 링크하는 경우 반드시 호출해야 함
- AFX_MANAGE_STATE(AfxGetStaticModuleState());
- ;
- CMyDlg myDlg;
- myDlg.DoModal();
- }
- /* in EXE */
- // Import 라이브러리를 프로젝트에 포함 시켜야 함.
- extern "C" __declspec(dllimport) void ShowDlg();
- // 전역 함수와 같이 사용
EXE에서 DLL의 리소스 참조
명시적 연결
- class CMyExeApp : public CWndApp
- {
- ;
- HINSTANCE m_hMyDll;
- }
- BOOL CMyExeApp::InitInstance()
- {
- ;
- if ( (m_hMyDll = LoadLibrary("MyDll.dll") == NULL )
- {
- AfxMessageBox("Cannot find the MyDll.dll file.");
- }
- return TRUE;
- }
- int CMyExeApp::ExitInstance()
- {
- FreeLibrary(m_hMyDll);
- return CWndApp::ExitInstance();
- }
- #include "../MyDll/Resource.h"
- void CMyExeApp::ShowMyDllResource()
- {
- HINSTANCE hDefault = AfxGetResourceHandle();
- AfxSetResourceHandle(m_hMyDll);
- CString strDllRes;
- strDllRes.LoadString(IDS_DLLSTRING);
- AfxSetResourceHandle(hDefault);
- AfxMessageBox(strDllRes);
- }



덧글