0

JNA を使用して、現在実行中のすべての Windows プログラムとそのコマンド ラインのリストを取得する方法を探しています。このサイトにはいくつかのチュートリアルがあります ( Get list of processes on Windows in a charset-safe way ) 実行中のプログラム名のリストを取得する方法を示していますが、完全なコマンドラインを探しています。これを行うための Module32First 関数の使用について言及している投稿を見たことがありますが、JNA を介してそれを使用する方法に関するドキュメントが見つからないようです。何か案は?

編集:

私は現在、前述の投稿から以下を試しました。アイデアは、ウィンドウで現在実行中のすべてのプロセスを反復処理し、それらのコマンド ラインを取得するプロセス内の方法が必要であるということです。wmic は使いたくありません。

   Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
    Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();          

    WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
    try  {
        while (kernel32.Process32Next(snapshot, processEntry)) {             
            System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));
        }
    }
    finally {
        kernel32.CloseHandle(snapshot);
    }

EDIT2:

Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx)を見ると、以下のように表示されます。JNAを介して実行可能ファイルへのフルパスを取得しようとしています。JNAがMODULE32ENTRY構造ではなく、Module32First関数をサポートしていないと思います。

szExeFile プロセスの実行可能ファイルの名前。実行可能ファイルへの完全なパスを取得するには、Module32First 関数を呼び出し、返された MODULEENTRY32 構造体の szExePath メンバーを確認します。ただし、呼び出し元のプロセスが 32 ビット プロセスの場合は、QueryFullProcessImageName 関数を呼び出して、64 ビット プロセスの実行可能ファイルの完全なパスを取得する必要があります。

4

1 に答える 1

0

これまでに何を試しましたか?型マッピングは簡単で、JNA は既存の定義を簡単に拡張して拡張できるように設計されています。

// Original C
typedef struct tagMODULEENTRY32 {
  DWORD   dwSize;
  DWORD   th32ModuleID;
  DWORD   th32ProcessID;
  DWORD   GlblcntUsage;
  DWORD   ProccntUsage;
  BYTE    *modBaseAddr;
  DWORD   modBaseSize;
  HMODULE hModule;
  TCHAR   szModule[MAX_MODULE_NAME32 + 1];
  TCHAR   szExePath[MAX_PATH];
} MODULEENTRY32, *PMODULEENTRY32;

// JNA equivalent (unicode version)
public interface MyKernel32 extends Kernel32 {
    class MODULEENTRY32 extends Structure {
        DWORD dwSize;
        DWORD th32ModuleID;
        DWORD th32ProcessID;
        DWORD GlblcntUsage;
        DWORD ProccntUsage;
        Pointer modBaseAddr;
        DWORD modBaseSize;
        HMODULE hModule;
        char[] szModule = new char[MAX_MODUE_NAME32+1];
        char[] szExePath = new char[MAX_PATH];
        public String szModule() { return Native.toString(this.szModule); }
        public String szExePath() { return Native.toString(this.szExePath); }
        protected List getFieldOrder() {
            return Arrays.asList(new String[] {
                "dwSize", "th32ModuleID", "th32ProcessID", "GlblcntUsage", "ProccntUsage", "modBaseAddr", "modBaseSize", "hModule", "szModule", "szExePath",
            });
        }
    }

    MyKernel32 INSTANCE = (MyKernel32)Native.loadLibrary("kernel32", W32DEFAULT_OPTIONS);
    boolean Module32First(HANDLE hSnapshot, MODULEENTRY32 lpme);
}
于 2013-05-05T13:01:23.240 に答える