我试图编写一些函数来创建一个Windows消息专用窗口,用于处理剪贴板。我知道它没有创建窗口,但是当我添加GetLastError()
函数调用时,函数永远不会返回到Java。这使得调试变得棘手。
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 :(得分: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
实现,它可以更改上一个错误代码。