Получение значения выходного параметра, установленного методом VBScript (WMI) в Java через JACOB - PullRequest
1 голос
/ 26 февраля 2011

Пытаюсь конвертировать VBScript в java, используя библиотеку JACOB - Java COM bridge. Метод 'Create' в VBScript принимает параметр [out] в своем методе и устанавливает его при выполнении метода, и я не мог понять, как получить его обратно через JACOB.

VBScript в вопросе:

Function CreateProcess(strComputer, strCommand)
    Dim objWMIService, objProcess
    Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\"     & strComputer & "\root\cimv2")
    Set objProcess = objWMIService.Get("Win32_Process")

    errReturn = objProcess.Create (strCommand, Null, Null, intProcessID)

    Set objWMIService = Nothing
    Set objProcess = Nothing

    CreateProcess = intProcessID
End Function

intProcessID - это [out] параметр, установленный после выполнения метода. ( Создание контракта API )

Преобразованный код Java (неполный и слегка измененный для демонстрации):

public static void createProcess() {
    String host = "localhost";
    String connectStr = String
            .format("winmgmts:{impersonationLevel=impersonate}!\\\\%s\\root\\CIMV2",
                    host);
    ActiveXComponent axWMI = new ActiveXComponent(connectStr);

    Variant vCollection = axWMI.invoke("get", new Variant("Win32_Process"));

    Dispatch d = vCollection.toDispatch();

    Integer processId = null;
    int result = Dispatch.call(d, "Create", "notepad.exe", null, null, processId)
            .toInt();
    System.out.println("Result:" + result);

    // WORKS FINE until here i.e. notepad launches properly, however processId still seems to be null. Following commented code is wrong - doesn't work     

    //Variant v = Dispatch.get(d, "processId"); // even ProcessId doesn't work
    //int pId = v.getInt();
    //System.out.println("process id:"
    //      + pId);

    // what is the right way to get the process ID set by 'Create' method?

}

Было бы замечательно, если бы вы могли предоставить некоторые указатели или соответствующий код. Спроси меня больше, если нужно. Заранее спасибо.

1 Ответ

3 голосов
/ 24 мая 2011

Замена

Integer processId = null;

с

Variant processId = new Variant(0, true);

должно решить проблему. После этого у вас должен быть идентификатор процесса notepad.exe в варианте processId, и его можно получить с помощью

processId.getIntRef()
...