Study/API

[API] Error C2664, E0167 - DLGPROC형식의 변환

한돌이 2020. 3. 24. 17:27
// DialogBox 프록시저
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	switch (iMessage)
	{
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case ID_NEW_GAME:
			g_GameManager.ResetGame();

			break;

		case ID_OPTION:
			// DialogBox 생성(인스턴, 리소스(템플리트), Dialog가 뿌려질 윈도우, DialogBox 프록시저)
			DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, AboutDlgProc);

			break;
			
		case ID_EXIT:
			PostQuitMessage(0);
			break;
		}

		return 0;

		// 윈도우가 파괴되었다는 메시지다.
	case WM_DESTROY:
		// GetMessage함수에 WM_QUIT 메시지를 보낸다.
		PostQuitMessage(0);

		return 0;
	}

	// case에 있는 메시지를 제외한 나머지 메시지를 처리한다.
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

<WinMain.cpp>

1. 오류

 DialogBox를 생성할 때 4번째 인자인 DialogBox 프록시저에서 아래의 2가지 오류가 발생한다.

<발생한 오류>

2. 해결 방법

DLGPROC Dlgproc;

INT_PTR Dlgproc(
  HWND Arg1,
  UINT Arg2,
  WPARAM Arg3,
  LPARAM Arg4
)

<Dlgproc의 정의>

 

int DialogBox( HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc );

<DialogBox의 정의>

 

 Dlgproc의 정의를 보면 INT_PTR을 리턴 값으로 가지고 있다. 오류가 생긴 코드에서 DialogBox 프록시저는 BOOL형을 리턴 값으로 가지고 있다. 따라서 선언한 프록시저를 INT_PTR형을 리턴 값으로 갖도록 수정하거나 함수 이름에 주소연산자를 붙여 포인터로 만들어 강제 형변환을 해주어야 한다.

 

// DialogBox 프록시저
BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	switch (iMessage)
	{
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case ID_NEW_GAME:
			g_GameManager.ResetGame();

			break;

		case ID_OPTION:
			// DialogBox 생성(인스턴, 리소스(템플리트), Dialog가 뿌려질 윈도우, DialogBox 프록시저)
			DialogBox(g_hInst, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, (DLGPROC)&AboutDlgProc);

			break;
			
		case ID_EXIT:
			PostQuitMessage(0);
			break;
		}

		return 0;

		// 윈도우가 파괴되었다는 메시지다.
	case WM_DESTROY:
		// GetMessage함수에 WM_QUIT 메시지를 보낸다.
		PostQuitMessage(0);

		return 0;
	}

	// case에 있는 메시지를 제외한 나머지 메시지를 처리한다.
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

<수정한 WinMain.cpp>


참고1 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=703385&ref=703385

참고2 : https://docs.microsoft.com/en-us/windows/win32/api/winuser/nc-winuser-dlgproc

참고3 : http://www.soen.kr/lecture/win32api/reference/Function/DialogBox.htm