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

时间:2016-06-17 04:02:46

标签: java c dll java-native-interface

我试图编写一些函数来创建一个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;
}

1 个答案:

答案 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实现,它可以更改上一个错误代码。