我正在尝试编写一些函数来创建用于剪贴板的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;
}
最佳答案
您的程序无法继续,因为您将无效的指针传递给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
实现,因此它可以更改最后的错误代码。