본문 바로가기

C/C++

DLL API에서 'DialogBox' 사용하기

DLL API에서 'DialogBox' 사용하기

 

 

 DialogBox 함수는 아래와 같이 정의된다.

INT_PTR WINAPI DialogBox(
  __in_opt  HINSTANCE hInstance,
  __in      LPCTSTR lpTemplate,
  __in_opt  HWND hWndParent,
  __in_opt  DLGPROC lpDialogFunc
);

 

여기서 첫번째 파라미터인 HINSTANCE를 보면, 이렇다.

HINSTANCE

A handle to the module whose executable file contains the dialog box template.

 

문제:

이 파라미터를 'NULL'로 세팅을 하면, 실행 가능한 파일의 핸들이라는 의미이다.

그러나 DLL 모듈에서의 다이얼로그 리소스는 실행 가능한 모듈이 아니다.

그러므로 당연히 DialogBox 함수는 invalid handle 오류를 발생시킨다.

 

해결:

그럼 어떻게 하느냐..

DialogBox에 DLL 모듈 핸들을 넘겨주면 된다. 그러니까....

DLL 프로젝트에 전역 변수를 정의하고, DLL 모듈 핸들을 저장한다.

예를 들어,

dll 프로젝트의 DllMain 함수를 추가하고, 전역 변수에 DLL 모듈 핸들을 저장한다.

 

아래와 같이,

HINSTANCE hinst=NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)

{

            hinst=hinstDLL;

   //other code

   //.......

            return true;

}

 

그리고는,

void WINAPI About()

{

   DialogBox(hinst,MAKEINTRESOURCE (IDD_DIALOG_ADD),NULL,DialogProc,NULL);

}

 

참고로, LPCSTR보다는 MAKEINTRESOURCE 매크로를 사용할것

 

<출처>

http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/5bf5ea49-f471-4686-9e48-5cf3f9ccb1f0/