아래의 글은 제가 작성한 것이 아닙니다. 데브피아의 Q/A에서 발췌한 것으로써,
아직 제 머릿속이 정리가 안되 임시적으로 올린 것입니다.
이 내용이 정리되면 제가 다시 쓰겠습니다.


DLL에서 리소스를 사용할 때 흔히 발생하면서도 아주 고약한 문제중 하나입니다.
다음과 같은 전용 클래스를 만들어서 사용하시면 사용하기도 편하고 문제도 간단히 해결됩니다.



    
//=======================================================================
// XTDLLState.h 파일
//=======================================================================
#ifndef __EXTDLLSTATE_H__
#define __EXTDLLSTATE_H__
class CEXTDLLState  
{
public:
CEXTDLLState();
    virtual ~CEXTDLLState();
protected:
    HINSTANCE m_hInstOld;
};

//extern static AFX_EXTENSION_MODULE TextEffectDllDLL; #endif // !defined(AFX_EXTDLLSTATE_H__300ABF7E_3541_4AE3_8080_978EA6E1399D__INCLUDED_)

//======================================================================= // XTDLLState.cpp 파일 //======================================================================= #include "stdafx.h" #include "EXTDLLState.h" CEXTDLLState::CEXTDLLState() {    CString strDll;    // FCubic Common DLL 연결 #ifdef _DEBUG    strDll = _T("MyDll_d.dll");        // 디버그용으로 생성한 Dll 이름 #else    strDll = _T("MyDll.dll");            // 릴리즈용으로 생성한 Dll 이름 #endif

  m_hInstOld = AfxGetResourceHandle();   AfxSetResourceHandle( ::GetModuleHandle(strDll) ); }

CEXTDLLState::~CEXTDLLState() {   AfxSetResourceHandle(m_hInstOld); }


위와 같이 간단한 클래스를 만드세요.
단 "MyDll_d.dll" 과 "MyDll.dll" 부분을 자신의 Dll 이름으로 바꾸세요.
보니까 님께서는 대화상자 리소스를 쓰려고 하시는 것 같은데요..
이런 경우엔 대화상자 클래스에서 DoModal()을 오버라이딩해서 함수를 만들고 그안에 다음과 같이 코딩해 보세요.

// 헤더를 추가
#include "EXTDLLState.h"
// DoModa() 함수 오버라이딩
int CMyDlg::DoModal()
{
   // 서로 다른 DLL이 각각의 리소스를 올바로 사용하기 위해
   // DoModal() 이 호출될때 CEXTDLLState 클래스의 인스턴스를 생성하고
   // DoModal() 함수가 종료될때 CEXTDLLState 클래스가 소멸하면서 리소스 연결처리를 자동으로 해준다.
   // 자세한 처리는 CEXTDLLState 클래스의 생성자와 소멸자를 참고한다.
   CEXTDLLState State;
   return CDialog::DoModal();
}

단지 위CEXTDLLState의 인스턴스인  State를 정의함으로써 자동으로 리소스를 연결하고 해제하도록 해줍니다.
이유는 생성자와 소멸자의 호출 메카니즘에 의해서이죠...
그럼 즐프하세요... ^^

728x90

+ Recent posts