gpt4 book ai didi

java - 为什么 GetLastError() 会阻止我的方法?

转载 作者:行者123 更新时间:2023-11-30 18:51:09 25 4
gpt4 key购买 nike

我正在尝试编写一些函数来创建仅用于使用剪贴板的 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);
}

或者,如果您想要人类可读的错误消息,您可以使用 FormatMessage 函数,如 MSDN 中所述:Retrieving the Last-Error Code

还要注意在错误发生后立即调用 GetLastError,因为当前线程的最后一个错误代码可以被另一个函数替换。例如,在示例代码中,您在调用 GetLastError 之前调用 printf。由于我们不知道 printf 实现,它可以更改最后一个错误代码。

关于java - 为什么 GetLastError() 会阻止我的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37872931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com