2016-06-17 4 views
-1

저는 클립 보드 작업을위한 Windows 메시지 전용 창을 만들기위한 몇 가지 함수를 작성하려고합니다. 창을 만들지 못하는 것을 알고 있지만 GetLastError() 함수 호출을 추가하면 함수가 Java로 반환되지 않습니다. 이로 인해 디버깅이 까다로워졌습니다.GetLastError()가 내 메서드를 차단하는 이유는 무엇입니까?

JNIEXPORT jlong JNICALL Java_com_mypackage_ClipboardHelper_initialize 
    (JNIEnv *env, jclass obj, jstring arg) { 

    WNDCLASSEXW wc; 

    ZeroMemory(&wc, sizeof(wc)); 
    wc.cbSize = sizeof(wc); 
    wc.lpszClassName = _CC_WNDCLASSNAME; 
    wc.lpfnWndProc = WndProc; 
    wc.hInstance = GetModuleHandleW(NULL); 

    if (!RegisterClassExW(&wc)) { 
     printf("failed to register window class\n"); 
    } 

    gWindowHandle = CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, 
     _CC_WNDCLASSNAME, 
     L"CC clipboard helper window", 
     0, 0, 0, 0, 0, 
     HWND_MESSAGE, NULL, 
     GetModuleHandleW(NULL), 
     NULL); 

    if (!gWindowHandle) { 
     printf("failed to create window\n"); 
     printf(GetLastError()); //this line causes function to never return 
     printf("\n"); 
     fflush(stdout); 
    } 

    return gWindowHandle; 
} 
+0

저는 Windows 전문가는 아니지만 [GetLastError] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx) 참조는 다음과 같이 말합니다. : "반환 값은 호출 스레드의 마지막 오류 코드입니다." 이것이 맞다면 문자열이 아니므로'printf'로 넘길 수 없습니다. – kaylum

+0

다른 오류를 일으킬 수있는 다른 작업을 수행 한 후에 오류를 즉시 호출해야합니다. – EJP

답변

2

printf에 잘못된 포인터가 전달되어 프로그램을 계속할 수 없습니다. GetLastError은 DWORD를 반환하고 printf에 의해 char* 포인터로 간주됩니다.

당신은 마지막 오류를 코드를 표시하려면이 같은 코드를 변경할 수 있습니다

if (!gWindowHandle) { 
    printf("failed to create window with error=%d\n",GetLastError()); 
    fflush(stdout); 
} 

또는 당신은 MSDN에서 여기에서 설명하는대로하는 formatMessage 기능을 사용할 수있는 사람이 읽을 수있는 오류 메시지가 원하는 경우 : Retrieving the Last-Error Code

또한 현재 스레드의 마지막 오류 코드를 다른 기능으로 바꿀 수 있기 때문에 오류가 발생한 직후 GetLastError으로 전화하십시오. 예를 들어, GetLastError을 호출하기 전에 샘플 코드에서 printf으로 전화하십시오. printf 구현을 알 수 없으므로 마지막 오류 코드가 변경 될 수 있습니다.

+0

어쨌든 나는 자바의 println이 무엇이든 작동하도록 과부하가 걸린 것에 익숙하다. 감사! – Tenfour04

관련 문제