[완료]visual studio 2010에서 api프로그램 질문입니다.
글쓴이: honggogo / 작성시간: 수, 2011/02/09 - 1:10오전
#include <windows.h> ATOM RegisterMainWndClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE hInstance, int nCmdShow); LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); static TCHAR gszAppName[] = TEXT("HelloWin"); // WinMain 함수 부분 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; if(!RegisterMainWndClass(hInstance)) return -1; // WNDCLASS 등록 if(!InitInstance(hInstance, SW_SHOWNORMAL)) return -1; // 인스턴스 초기화 // 메시지 루프 부분 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } // WNDCLASS 등록 부분 ATOM RegisterMainWndClass(HINSTANCE hInstance) { WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = MainWndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH) GetStockObject (HOLLOW_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = gszAppName; if (!RegisterClass (&wndclass)) { MessageBox (NULL, TEXT("This program requires Windows XP!"), gszAppName, MB_ICONERROR); return 0; } return RegisterClass(&wndclass); } // 인스턴스를 초기화 하는 부분 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hwnd; hwnd = CreateWindow (gszAppName, L"The Hello Program", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow (hwnd, nCmdShow); UpdateWindow (hwnd); return TRUE; } LRESULT CALLBACK MainWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT rect; switch (message) { case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); GetClientRect (hwnd, &rect); DrawText (hdc, L"Hello, Windows7!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); EndPaint (hwnd, &ps); return 0; case WM_DESTROY: PostQuitMessage (0); return 0; } return DefWindowProc (hwnd, message, wParam, lParam); }
비주얼 스튜디오 6.0에서는
되는데 2010가면 윈도우창이 생성이 안됩니다.
똑같은 코드로 돌리는데 왜안될까요.ㅠㅠ
물론 컴파일러가 많이 바뀐거 알겠지만..
지금 노트북이 윈도우 7을 쓰고있어서 스튜디오가 6.0이 안깔리는 상태에서
질문입니다.ㅠ
*지금 빌드는 성공되었고 에러가 없는상태에서
ShowWindow (hwnd, nCmdShow);
UpdateWindow (hwnd);
요부분이 안되는거 같아요ㅠ
Forums:
Visual Studio 6 는 괴랄하군요.
그때는 저걸 통과시킨 이유가 있을런지 모르지만 지금으로서는 괴랄하게 보이네요.
제 computer에서는 InitInstance 함수호출을 진입하질 못합니다.
Visual Studio 2010으로 C++ build 해본 것은 처음인데 첫 build에서 구문분석하고 별 걸 다하네요. 좀 놀랬습니다.
ㅠㅠ
일단 답글 달아주셔서 감사합니다.
일단 오류를 찾았네요
if(!RegisterMainWndClass(hInstance))
return -1;
제가 디버깅모드로 돌려보니까
여기서 프로그램이 종료되었네요.
return하고 종료되어서 이거 풀어주거나 새로 에러처리 해야될꺼같네요.ㅎ
모두 java만하면 밭은 누가갈어?? 밭갈고 싶어 C를 배운다.
RegisterClass 두번 하셔서 그렇습니다.
같은 WNDCLASS 객체를 두번 RegisterClass를 했기 때문에 RegisterMainWndClass의 반환값을 만드는 두번째 RegisterClass 호출이 실패하게 됩니다. 따라서 조건문과 반환값에 양쪽으로 사용하고 싶다면 ATOM 객체로 초기화해서 조건문에 사용하고 난 후 반환하셔야 합니다. MessageBox 함수를 아예 RegistMainWndClass 함수호출을 하는 조건문 몸체에 넣는게 좋지 않을까라는 생각도 드네요.
RegisterClass 안의 오류메세지를 좀더 정확히 말하자면 Windows NT 계열이 요구된다고 할 수 있습니다. 그 조건처리는 RegisterClass의 실패원인이 오직 RegisterClassW 즉 UNICODE 함수에 대한 지원을 못하는 Windows(즉 Windows Me 이하의 내부 16bit API 위주의 Windows)에서 실행되었다는 것을 가정합니다. 사실 MS에서 Windows XP SP2 이하에 대한 지원을 중단했기 때문에 Windows XP가 요구된다고 해도 무방하긴 합니다.
오오오 감사합니다..
오오오 감사합니다..
모두 java만하면 밭은 누가갈어?? 밭갈고 싶어 C를 배운다.
RegisterMainWndClass(hInstance) 여기서 0을 반환하네요.ㅠㅠ
RegisterMainWndClass(hInstance) 여기서 0을 반환하네요.ㅠㅠ
모두 java만하면 밭은 누가갈어?? 밭갈고 싶어 C를 배운다.
댓글 달기