2009-08-12 3 views
0

OK。私はJavaで書いているプログラムを、JNIを使​​ってWindowsのデスクトップがロックされているかどうかを調べることができるようにしようとしています。私はJNIを動作させることに成功しましたが、私が最初に使っていたCコードは正解を返さなかったのです。新しいコード(from here on SO)が少しありましたが、リンクエラーが発生しています。MinGWがuser32とリンクしていないようです。

リンクすると、OpenInputDesktopとOpenDesktopの2つの未定義の参照が2つあります。これらは両方とも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 _DllM[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 

あなたはすべてのその混乱を読みに行くのであれば、あなたはそのCが表示されます:(libuser32.aが保たれている)/ MinGWの/ libと-luser32はすでに両方ともそこにあります。基本的に、これはうまくリンクする必要があります。

これは私がターミナルサービスAPIを使用していたので以前は-lwtsapi32なしで使用していたのと同じコマンドで、正常に動作し、必要なライブラリを見つけることができました。

私はXPで、Win9xの互換性について心配する必要がないので、私が取ったコード(dan_gの答え)を変えたのは静的変数を取り除くことでした。彼のコードをそのまま使用した場合、同じ基本エラーが発生します。たとえば、すでにLinkerコマンドに含まれているkernel32にあるにもかかわらず、GetProcAddressとリンクできません。

私はいくつかの魔法のコマンドを逃していると思っています。標準Win32APIの関数はリンクしたくないようです.CとMinGWを使用してから数年が経ちました。私はかなり前にやったこともありません。

誰かが正しい方向に向かうことができますか?


[OK]を、私はこれ以上作業していると私はまだ固執しています。私は元シンプルで小さな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

問題を把握しました。私はJavaはJNIで使用するためのDLLに置くために私のコードをコンパイルするとき、私はオブジェクト・ファイルに何があるか確認するためにNMを使用する場合、オブジェクトファイルは、これらの2つのリストがあります

 U _CloseDesktop 
    U _OpenInputDesktop 

それがリンクする時間が来ると、それらは見つかりませんので、私はリンカのエラーを取得します。あなたが私の、JNI DLLを作るためにコンパイルするときに、見ることができるように

 U [email protected] 
    U [email protected] 

:私は(明らかにJavaのでは動作しません)DLLにすべてのJNIのものなしでコードをコンパイルするときの記号は次のようになり関数が@nで修飾されていないため、リンクエラーが発生しています。誰も私がこれをどのように修正できるか知っていますか?

だから問題は何ですか?

私はすべての違いを作っ

WINDOWS.Hを含めていませんでした。たぶん、これは他の誰かを助けるでしょう。