Xpoint
   [напомнить пароль]

Указать рабочую директорию для запуска внешней программы

2005-05-30 13:06:49 [обр] Alexander [досье]
Запускаю внешнюю программу с помощью интерфейса nsIProcess. Подскажите как указать для этого процесса рабочую директорию. Это нужно если программе требуются какие-либо файлы, находящиеся в ее каталоге (например dll). Внешние программы пишу не я - поправить их возможности нет. Реализовал вариан с bat файлом (сначала cd workdir потом запуск), но помоему это не приемлемо, к тому же при запуске мигает окно консоли.
спустя 24 минуты [обр] Владимир Палант [досье]
Боюсь, что Mozilla тут не поможет — возможности указывать каталог выполнения пока нет. Под Windows всегда используется CreateProcess() со значением NULL для каталога выполнения, под другими системами функция PR_CreateProcess() из NSPR, у которой в параметрах вообще нет каталога выполнения. То есть, делать что-то типа bat-файла придётся. Если мешает окно консоли, можно использовать Windows Scripting Host. У меня в одной из наработок используется такой .wsf-файл:
<job id="test">
   <script language="JavaScript">
      var Shell = WScript.CreateObject("WScript.Shell");
      Shell.CurrentDirectory = WScript.ScriptFullName.replace(/\\[^\\]+$/, '');
      Shell.Run("program.exe param1 param2", 0, false);
   </script>
</job>
спустя 21 час [обр] Alexander [досье]
Да, спасибо за ответ. А как теперь этот файл запустить из Firefox. Не получается как обычные - выдается сообщение от ошибке призапуске.
Используемый код:
fileInst_f = new Components.Constructor("@mozilla.org/file/local;1", "nsILocalFile", "initWithPath");
var fileInst = fileInst_f(path);
var theProcess = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
theProcess.init(fileInst);
rv = theProcess.run(false, null, 0);
спустя 51 минуту [обр] Владимир Палант [досье]
Запускать как параметр для WScript.exe. Вот только его найти сначала надо, у себя я, кажется, просто прописал путь жестко.
спустя 1 день 11 часов [обр] Данил Иванов [досье]

Просто интересно, насколько корректен и работоспособен такой способ поиска WScript.exe:

var winSysD = Components.classes["@mozilla.org/file/directory_service;1"]
                        .getService(Components.interfaces.nsIProperties)
                        .get("SysD", Components.interfaces.nsIFile).path;
var wscriptFile = Components.classes["@mozilla.org/file/local;1"]
                            .createInstance(Components.interfaces.nsILocalFile);
wscriptFile.initWithPath(winSysD);
wscriptFile.append("wscript.exe");
// if (!wscriptFile.exists()) { _some_action_ }
// .....
// var fileInst = fileInst_f(wscriptFile.path);
// .....
// theProcess.run(false,["D:\\test\\test.wsf"],1);

Под рукой только w2k3. В 98 будет работать? Т.е. там WScript.exe тоже расположен в системном каталоге?

спустя 1 час 58 минут [обр] Владимир Палант [досье]
var wscriptFile = Components.classes["@mozilla.org/file/directory_service;1"]
                            .getService(Components.interfaces.nsIProperties)
                           .get("SysD", Components.interfaces.nsIFile);
wscriptFile.append("wscript.exe");

Не проще ли? :)

Что касается Windows 9x — нет, работать не будет. "SysD" содержит результат вызова GetSystemDirectory(), там это будет \Windows\system, а wscript.exe расположен в \Windows — это "WinD". Думаю, что надо просто пробовать оба значения — не найдётся ли файл в одном из этих каталогов. Проверить не могу, тоже нет Windows 98 под рукой.

спустя 13 минут [обр] Владимир Палант [досье]

Случайно попался на глаза другой подход:

var scriptFile = Components.classes["@mozilla.org/file/local;1"]
                            .createInstance(Components.interfaces.nsILocalFile);
scriptFile.initWithPath("D:\\test\\test.wsf");
scriptFile.launch();

Это если использование nsIProcess не принципиально...

спустя 5 часов [обр] Данил Иванов [досье]

Спасибо.

Не проще ли? :)

Ну как всегда. :)

Powered by POEM™ Engine Copyright © 2002-2005