私はクリップボードを操作するための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;
}
私は、Windowsの専門家ではないが、[GetLastError関数](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679360%28v=vs.85%29.aspx)参照は言います: "戻り値は呼び出しスレッドの最後のエラーコードです"。それが正しければ、文字列ではないので 'printf'に渡すことはできません。 – kaylum
他のエラーの原因となる可能性のあるものを実行した後ではなく、すぐにエラーが発生した場合は、すぐに呼び出す必要があります。あなたは 'のprintf( "ウィンドウの作成に失敗しました:エラー=%d個の\ n" は、GetLastErrorを())が必要です;' – EJP