2016-06-17 18 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( "ウィンドウの作成に失敗しました:エラー=%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を呼び出すように注意してください。たとえば、サンプルコードでprintfを呼び出す前にGetLastErrorを呼び出します。 printfの実装がわからないため、最後のエラーコードが変更される可能性があります。

+0

うわ、私はとてもJavaの 'println'は何で動作するようにオーバーロードされることに慣れています。ありがとう! – Tenfour04

関連する問題