代码之家  ›  专栏  ›  技术社区  ›  MBCook

MinGW似乎与user32没有关联

  •  0
  • MBCook  · 技术社区  · 16 年前

    好啊我一直在尝试让我用Java编写的程序能够发现Windows桌面是否被JNI锁定。我已经成功地使JNI工作,但是我最初使用的C代码没有返回正确的答案。我有一些新的密码( from here on SO ),更改了一点,但我有链接错误。

    链接时,我得到两个未定义的引用,一个指向OpenInputDesktop,另一个指向CloseDesktop。它们都是user32.dll的一部分。

    我用来链接和创建DLL的命令是:

    c:/MinGW/bin/gcc -shared -o JNIHelper.dll
                      com_little_cute_display_helper_JNIHelper.o
                      -Wl,--add-stdcall-alias,--kill-at,--output-def,def_file
    

     c:/MinGW/bin/../libexec/gcc/mingw32/3.4.5/collect2.exe --shared -Bdynamic
               -e _DllMainCRTStartup@12 --enable-auto-image-base -o JNIHelper.dll
               /mingw/lib/dllcrt2.o c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtbegin.o
               -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5
               -Lc:/MinGW/bin/../lib/gcc -L/mingw/lib/gcc/mingw32/3.4.5
               -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib
               -L/mingw/lib/gcc/mingw32/3.4.5/../../../../mingw32/lib
               -L/mingw/lib -Lc:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../..
               -L/mingw/lib/gcc/mingw32/3.4.5/../../.. 
               com_little_cute_display_helper_JNIHelper.o
               --add-stdcall-alias --kill-at --output-def def_file
               -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32
               -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt
               c:/MinGW/bin/../lib/gcc/mingw32/3.4.5/crtend.o
    

    因此,如果您仔细阅读所有这些混乱,您将看到c:/MinGW/lib(保存libuser32.a的地方)和-luser32都已经在其中了。基本上,这应该很好。

    这是我之前在没有-lwtsapi32的情况下使用的同一个命令(因为我使用的是终端服务API),它当时运行良好,能够找到它需要的库。

    现在我在代码中所做的更改(dan_g的回答)是去掉了静态变量,因为我在XP上,不需要担心Win9x的兼容性。当我按原样使用他的代码时,我得到了相同的基本错误,例如,无法链接到GetProcAddress,即使它在已经在linker命令中的kernel32中。

    我想我错过了一些魔法指令。标准Win32API中的函数似乎不想链接。我用C和MinGW已经好几年了。我做了很多以前没有做过的事。


    好吧,我一直在进一步研究这个问题,但我还是被卡住了。如果我让源代码成为一个简单的小C程序(没有JNI的东西),它看起来是这样的:

    #define _WIN32_WINNT 0x0501
    #define WINVER 0x0501
    #include <windows.h>
    #include <windef.h>
    #include <winnt.h>
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int iCmdShow) {
    
        HDESK hDesk = OpenInputDesktop(0, FALSE, MAXIMUM_ALLOWED);
    
        if (hDesk) {
            CloseDesktop(hDesk);
    
            printf("unlocked");
        } else {
            printf("locked");
        }
    }
    

    1 回复  |  直到 9 年前
        1
  •  2
  •   MBCook    16 年前

    我已经解决了这个问题。当我编译代码以放入供JNI使用的Java DLL时,当我使用nm查看对象文件中的内容时,对象文件有以下两个列表:

         U _CloseDesktop
         U _OpenInputDesktop
    

    当需要链接时,没有找到这些链接,因此我得到链接器错误。当我将没有所有JNI内容的代码编译到DLL(显然无法与Java一起工作)时,符号如下所示:

         U _CloseDesktop@4
         U _OpenInputDesktop@12
    

    正如您所看到的,当编译以生成JNI DLL时,我的函数并没有被@n修饰,这就是导致链接错误的原因。有人知道我怎么解决这个问题吗?

    那么问题出在哪里呢?

    我不包括windows