2016-06-17 17 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

您還需要立即調用它,而不是在做其他可能導致其他錯誤的事情之後得到錯誤。你應該有'printf(「無法創建窗口:error =%d \ n」,GetLastError());' – 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

呃,我很習慣Java的'println'被重載以處理任何事情。謝謝! – Tenfour04

相關問題