2009-08-12 4 views
0

OK. Я пытался создать программу, которую я писал на Java, чтобы узнать, заблокирован ли рабочий стол Windows с помощью JNI. Мне удалось заставить JNI работать, но код C, который я использовал вначале, не возвращал правильный ответ. Я получил новый код (from here on SO), немного изменил его, но у меня возникли ошибки связи.MinGW не похоже, ссылается на user32

При связывании я получаю две неопределенные ссылки: одну для 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 

Я попытался добавить Lib каталога в явном виде, а также библиотеку, но ошибка та же. Это не удивительно, так как MinGW расширяет свою команду:

c:/MinGW/bin/../libexec/gcc/mingw32/3.4.5/collect2.exe --shared -Bdynamic 
      -e [email protected] --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 

Так что, если вы идете читать через все, что беспорядок, вы увидите, что с:/MinGW/Lib (где хранится libuser32.a) и -luser32 оба уже там. В принципе, это должно связываться штрафом.

Это та же самая команда, которую я использовал ранее, без -lwtsapi32 (так как я использовал API служб терминалов), и тогда он отлично работал и смог найти библиотеки, в которых он нуждается.

Теперь, что я изменил в коде, который я принял (ответ dan_g), должен был вынуть статические переменные, так как я нахожусь на XP и не нужно беспокоиться о совместимости с Win9x. Когда я использовал свой код как есть, я получил ту же основную ошибку, которая неспособна связать с GetProcAddress, например, хотя это находится в 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"); 
    } 
} 

MinGW счастливо компилировать и что, и запускается исполняемый. Если я использую команды, которые я использовал (изменил, чтобы отразить этот файл), он создает DLL без проблем.

ответ

1

Я выяснил проблему. Когда я компилирую мой код положить в DLL для Java для использования на JNI, объектный файл имеет этих двух списков, когда я использую нм, чтобы посмотреть, что в объектном файле:

 U _CloseDesktop 
    U _OpenInputDesktop 

Когда приходит время, чтобы связать, они не найдены, поэтому я получаю ошибку компоновщика. Когда я компилирую код без все вещи JNI в DLL (который, очевидно, не будет работать с Java) символы выглядеть следующим образом:

 U [email protected] 
    U [email protected] 

Как вы можете видеть, при компиляции сделать JNI DLL, мой функции не украшают @n, что и вызывает мою ошибку связывания. Кто-нибудь знает, как я могу это исправить?

В чем была проблема?

Я не был в том числе windows.h

Это вся разница. Может быть, это поможет кому-то другому.