我正在尝试编写一些函数来创建用于剪贴板的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实现,因此它可以更改最后的错误代码。

10-07 23:42