Собсно сабж. Поделитесь кодом плз.

Код можно подглядеть в расширении External Application Buttons.

Разберешся?
/* function startProcess - START EXTERNAL PROGRAM */
//new file object factory
const FileFactory = new Components.Constructor("@mozilla.org/file/local;1","nsILocalFile","initWithPath");

function startProcess(str_LocalProgram, arguments){
        //program to start
        str_LocalProgram = (str_LocalProgram == null)?"/usr/X11R6/bin/xterm":str_LocalProgram;
        //try to create file object
        try {
                var obj_Program = new FileFactory(str_LocalProgram);
        } catch (e) { alert(e) }

        //try to create process
        try {
                var obj_Process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
        } catch (e) { alert(e); }
        //setup process
        obj_Process.init(obj_Program);
        //start process
        obj_Process.run(false, arguments, ((arguments != null)?arguments.length:0), {});
    return obj_Program;
}

Выделить код

Код:

function launchfile1()
{
var file = Components.classes['@mozilla.org/file/local;1']
	.createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
	.getService(Components.interfaces.nsIProcess);
file.initWithPath('c:\windows\notepad.exe'); 
if(! file.exists()) 
  {
	alert('file not found!');
  }
else
  { 
	alert('start');
	file.launch(); 
	process.init(file); 
	var arguments='123'; 
	process.run(false, arguments, arguments.length); 
  }
}
Выделить код

Код:

function launchfile2()
{
alert('begin');
const FileFactory = new Components.Constructor("@mozilla.org/file/local;1","nsILocalFile","initWithPath");
str_LocalProgram ='c:\windows\notepad.exe';
try {
	alert('try1');
	var obj_Program = new FileFactory(str_LocalProgram);
	if (! obj_Program.exists())
                {
	  	alert('file not found!');
	  }
} catch (e) { alert('catch1'); alert(e) }

try {
	alert('try2');
	var obj_Process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
} catch (e) { alert('catch2'); alert(e); }
alert('init');
obj_Process.init(obj_Program);
alert('start');
obj_Process.run(false, arguments, 0, {});

}

Оба варианта выносит с сообщением 'file not found' :cry:
Файл ессно есть, но даже если проверку опустить, то все равно не работает...
Подскажите плз где ошибка

c:\\windows\\notepad.exe ыыыть, разоблася, всем спс =)

Но вот возник другой вопрос, как из XULRunner запустить браузер установленный в системе по-умолчанию? Выше перечисленные функции не работают, если в качестве файла указать урл. Есть какой-нибудь способ сделать это? Или другого пути нет кроме как "встроить" свой браузер?

может быть
"start url" если это win.

Неа, виснет на

Выделить код

Код:

file.initWithPath('start');

:(

formatC'vt пишет

...как из XULRunner запустить браузер установленный в системе по-умолчанию?...

Если файл локальный, то

Выделить код

Код:

var lf = Components. classes ["@mozilla.org/file/local;1"]. createInstance (Components. interfaces. nsILocalFile);
lf. initWithPath ("P:\\close_wind.html");
lf. launch ();

Прошу за простить за неточность формулировки вопроса, надо УРЛ открыть в браузере по-умолчанию.

Вспомнил детство, написал свою версию start.exe =)

Выделить код

Код:

format PE GUI
entry start

section '.flat' code data readable executable writeable

start:
        call [GetCommandLine]
@@loop: inc eax
        cmp byte[eax],'"'
        jnz @@loop
        inc eax
        inc eax
        push 1
        push 0
        push 0
        push eax
        push lpOperation
        push 0
        call [ShellExecute]
        push 0
        call [ExitProcess]

lpOperation db 'open',0

data import

  dd 0,0,0,RVA kernel_name,RVA kernel_table
  dd 0,0,0,RVA shell_name,RVA shell_table
  dd 0,0,0,0,0

  kernel_table:
    ExitProcess dd RVA _ExitProcess
    GetCommandLine dd RVA _GetCommandLineA
    dd 0
  shell_table:
    ShellExecute dd RVA _ShellExecuteA
    dd 0

  kernel_name db 'KERNEL32.DLL',0
  shell_name db 'SHELL32.DLL',0

  _ExitProcess dw 0
    db 'ExitProcess',0
  _GetCommandLineA dw 0
    db 'GetCommandLineA',0
  _ShellExecuteA dw 0
   db 'ShellExecuteA',0
end data

formatC'vt, насчёт детства ты загнул! Фасма тогда ещё не было! ;) Кстати, насчёт просмотра строки до закрывающей кавычки - моветон, сделай ещё проверку на нуль, вдруг кавычек не окажется? ;)

ViRUS, да не многим он от TASM'a отличается, что первое под руку попалось, на том и написал и особых проблем этот запоздалый переход не вызвал ;)
Кстати в случае отсутствия кавычек надо на пробел проверять в первую очередь, а не нуль, строка параметров через пробел тогда идет ;) Но на нуль проверка тоже не помешает, хотя запуск программы без переданных параметров не планируется. Но можно вместо:

Выделить код

Код:

start:
        call [GetCommandLine]
@@loop: inc eax
        cmp byte[eax],'"'
        jnz @@loop
        inc eax
        inc eax
        push 1
        push 0
        push 0
        push eax
        push lpOperation
        push 0
        call [ShellExecute]
        push 0
        call [ExitProcess]

Сделать:

Выделить код

Код:

start:
        call [GetCommandLine]
        cmp byte[eax],0
        jz @@exit
        cmp byte[eax],'"'
        jnz @@woQuote
@@quote:
        inc eax
        cmp byte[eax],0
        jz @@exit
        cmp byte[eax],'"'
        jnz @@quote
        inc eax
        jmp @@exec
@@woQuote:
        inc eax
        cmp byte[eax],0
        jz @@exit
        cmp byte[eax],' '
        jnz @@woQuote
@@exec:
        inc eax
        push 1
        push 0
        push 0
        push eax
        push lpOperation
        push 0
        call [ShellExecute]
@@exit:
        push 0
        call [ExitProcess]

Но самом деле проблема не в этом, а вот в чем:
Работает

Выделить код

Код:

obj_Process.run(false, 0,0);

Не работает

Выделить код

Код:

arguments='notepad.exe';
obj_Process.run(false, arguments,arguments.length);

Т.е. при попытке передать запускаему процессу какую-либо строку параметров он не запускается :(

Не запускается из-за переделанного start.exe? Или я чего не понял... Сорри, уже просто сплю... Завтра перечитаю - подумаю... :lol:

Ничего не запускает, даже это:

Выделить код

Код:

include 'include\win32ax.inc'
.code
  start:
	invoke	GetCommandLine
	invoke	MessageBox,HWND_DESKTOP,eax,"Command Line is",MB_OK
	invoke	ExitProcess,0
.end start

А если попробовать

Выделить код

Код:

var arguments=['notepad.exe'];

Если

Выделить код

Код:

arguments='notepad.exe';

то получаем, что длина arguments - 12, а надо-то наверное всего 1... Мож из-за этого? %)

Lynxx, понял, учим матчасть, спс заработало =)

formatC'vt
Лучше - читаем MozillaZine %) Ну и заодно матчасть поучить можно ;)

Привет, запускаю из firefox питоновский скрипт:

Выделить код

Код:

var file = Components.classes['@mozilla.org/file/local;1']

            .createInstance(Components.interfaces.nsILocalFile);

        var process = Components.classes['@mozilla.org/process/util;1']

            .getService(Components.interfaces.nsIProcess);

        file.initWithPath('D:\\python\\script3.py');
        process.init(file);

        var arguments=['...'];

        process.run(true, arguments, arguments.length);

Всё работает, но только один раз. Второй раз скрипт не запускается. Помогает только перезапуск firefox.

мою тему трёхлетней давности подняли :)
быть может скрипт этот работу не завершает, а подвисает?

var process = Components.classes["@mozilla.org/process/util;1"]
                        .createInstance(Components.interfaces.nsIProcess);

Относительно недавно поменяли, теперь нужно так.

Выделить код

Код:

var process = Components.classes["@mozilla.org/process/util;1"]
                        .createInstance(Components.interfaces.nsIProcess);

Спасибо! Работает!

28-12-2009 15:27:16
Вопрос! В какой кодировке передаются аргументы к запуску? utf-8? Если да, то как в cp1251 преобразовать?

AntoshaChips пишет

В какой кодировке передаются аргументы к запуску? utf-8? Если да, то как в cp1251 преобразовать?

Проверять нужно...
А перекодировать можно через nsIScriptableUnicodeConverter.

formatC'vt пишет

function launchfile1()
{
var file = Components.classes['@mozilla.org/file/local;1']
    .createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
    .getService(Components.interfaces.nsIProcess);
file.initWithPath('c:\windows\notepad.exe');
if(! file.exists())
  {
    alert('file not found!');
  }
else
  {
    alert('start');
    file.launch();
    process.init(file);
    var arguments='123';
    process.run(false, arguments, arguments.length);
  }
}

formatC'vt пишет

function launchfile2()
{
alert('begin');
const FileFactory = new Components.Constructor("@mozilla.org/file/local;1","nsILocalFile","initWithPath");
str_LocalProgram ='c:\windows\notepad.exe';
try {
    alert('try1');
    var obj_Program = new FileFactory(str_LocalProgram);
    if (! obj_Program.exists())
                {
          alert('file not found!');
      }
} catch (e) { alert('catch1'); alert(e) }

try {
    alert('try2');
    var obj_Process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
} catch (e) { alert('catch2'); alert(e); }
alert('init');
obj_Process.init(obj_Program);
alert('start');
obj_Process.run(false, arguments, 0, {});

}

Как можно запустить приложение или, например, текстовый файл, находящийся в установленном расширении, внутри zip (xpi) архива? Можно ли запустить это приложение поверх всех окон?

распаковать и запустить

02-10-2011 18:53:40
я сейчас изворачиваюсь так: создаю во временной директории скрипт, который исполняет некоторые команды и перенаправляет свой вывод в файл. потом парсю файл и получаю нужные мене данные. нет ли более прямых способов выполнять шелл-команды?

alex345 пишет

Как можно запустить приложение или, например, текстовый файл, находящийся в установленном расширении, внутри zip (xpi) архива?

Для начала - прочитать содержимое файла, и сохранить во временную папку. Распаковку можно сделать c помощью nsIZipReader.

alex345 пишет

Можно ли запустить это приложение поверх всех окон?

Вообще-то это исключительно свойство окна запускаемого приложения, и в общем случае запускающим приложением никак не задается. Если очень хочется - получайте хэндл окошка запущенного приложения (только учтите, что нужен хэндл от top-level window), далее - через js-ctypes делаете вызов SetWindowPos, задав hWndInsertAfter=HWND_TOPMOST. Разумеется, это решение специфично для платформы.

объясните понятным языком что куда приделать :)

selevo пишет

объясните понятным языком что куда приделать

всё зависит от конечной цели =)

да вот  хочу как бы панель управления сделатть  на страничке  своей
несколько кнопок  чтоб запускали те или иные файлы,желательно с параметрами хотя можно просто  батник запускать...
У меня   web бот стоит на компе и он может только в браузере  что-то делать,на страничках и вот ему надо дать задание чтоб прокси переключал  иногда или GSM модем переключал на др. оператора,а эт делается запуском прог.

на локальном компе надо всё запускать
c:\modemMTC.exe например
там где web-робот и работает.
ОС win

я уже начинаю нервничать....
вот  страница
запустите  ссылкой  свой блокнот на своём же компе
ну я  упрощаю конечно

web-бот написан  на selenium IDE расширение такое для  web автоматизации
и  работает только  со страничками.
Еслиб он мог кликать на кнопки  FF яб не заморачивался ,давно сделал бы что надо.

Мне  надо только  что бы заработала гиперссылка подобного типа и только это.
Слежение меня не интересует,всё уже есть.

аа,тоесть какое-то расширение даже типа  CB ,отслеживает клик на эту ссылку и запускает уже само от своего имени блокнот ,так ?

ну да так проще
вообще  как будут выглядеть урлы на страничке вообще не важно
,этож робот будет кликать, он заранее знает что
урл номер 1 это  запуск проги  блокнот
урл 2  запуск  модемной проги
урл 3 закрыть блокнот 
4 закрыть модемную прогу
примерно так

а можно пример странички с которой это будет работать ?

понял, сегодня завтра потестю.
Благодарю

работает вроде...
А реально ли   закрыть   notepad  таким же образом ?

оо,гибко)))
благодарю

о я про rundll32 уже начинал было читать  но  потом как то интересы повернулись.

а как таким же образом сделать так, чтобы  нажался элемент  управления (кнопка) в  одном из аддонов  FF ?
Конкретно  интересует нажатие кнопки  play в Selenium IDE

Да и вообще интересует  сам принцип реализации и доступа к таким вещам.

вот  ролик 
http://youtu.be/7Okuo3JDufQ
там я показал какую кнопку  надо жать ,кнопка запуска теста - зелёный треугольник.

вот что показывает

Выделить код

Код:

id="play-button"
 label="Play" 
class="icon"
 tooltiptext="Play current test case" 
command="cmd_selenium_play"
 oncommand="goDoCommand('cmd_selenium_play')"

http://youtu.be/NbCiPq26DBs

А в каком месте  этого кода разместить команду ?
И что именно написать в данном случаи ?

Выделить код

Код:

var myExt_urlBarListener = {
  QueryInterface: function(aIID)
  {
   if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
       aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
       aIID.equals(Components.interfaces.nsISupports))
     return this;
   throw Components.results.NS_NOINTERFACE;
  },

  onLocationChange: function(aProgress, aRequest, aURI)
  {
   setTimeout(progstart, 300);    
  },

  onStateChange: function(a, b, c, d) {},
  onProgressChange: function(a, b, c, d, e, f) {},
  onStatusChange: function(a, b, c, d) {},
  onSecurityChange: function(a, b, c) {}
};

gBrowser.addProgressListener(myExt_urlBarListener,Components.interfaces.nsIWebProgress.NOTIFY_LOCATION);

function progstart(){

var url=gURLBar.value;
if (url.match(/runmyprograms\.html#/g)=="runmyprograms.html#"){
var chkpoint='runmyprograms.html#';
var arrayOfStrings = url.split(chkpoint);
var numprg=arrayOfStrings[1]

if (numprg==1){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
else {
if (numprg==2){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\autoexec.bat", ""];
process.run(false, args, args.length)

}
else {
if (numprg==3){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
else {
if (numprg==4){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
else {
if (numprg==5){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
//-----------куски кода с обработкой вставляем сюда----сам кусок см.ниже закомментированный




//------------------------------------------------------------------------

}
}
}
}
}
//--------сюда добавляем фигурную скобку при добавлении куска с обработкой

}

/* -------кусок который нужно вставлять

else {
if (numprg==4){  // указываем цифру которую будем обрабатывать
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe"); // путь до екзешника НЕЗАБЫВАЕМ про двойные косые в пути!

var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""]; // аргументы для запуска, при надобности заменяем двойные кавычки одинарными, 
// всё что через пробел это отдельный арумент, т.е для aa.exe -vasya +pupkin "ololo 1111" u /z 
// записываем так: var args = ["-vasya", "+pupkin","'ololo","1111'","u","/z"];
// если прога не понимает одинарные кавычки в параметрах то делаем так  var args = ['-vasya', '+pupkin','"ololo','1111"','u','/z'];


process.run(false, args, args.length)

}



*/

благодарю,первое работает вроде нормально,буду тестить.

Совершенно тупой вопрос,а как  "нажать на кнопку " панели инструментов ?
ScreenShot673.jpg
(мне сначала нужно  само дополнение запустить)
я написал:

Выделить код

Код:

if (numprg==6){
BrowserBack();
toggleSidebar('viewSeleniumIDESidebar');// так кнопка называется в инспекторе
//goDoCommand('cmd_selenium_play');

Но так не  пашет )))

пробовал  вместо
toggleSidebar('viewSeleniumIDESidebar');

писать
goDoCommand('viewSeleniumIDESidebar');
не работает

попробовал
никакой реакции

отдельно созданная кнопка selenium запускает сам  обработчик  ссылки 6 вообще не обрабатывается,алертов нет.

И ещё почему-то я  поменял  цифру 5 на 6 в обработчике ссылок,а при нажатии на 5 всё равно запускается что было на ней раньше

скрытый текст
var myExt_urlBarListener = {
  QueryInterface: function(aIID)
  {
   if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
       aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
       aIID.equals(Components.interfaces.nsISupports))
     return this;
   throw Components.results.NS_NOINTERFACE;
  },

  onLocationChange: function(aProgress, aRequest, aURI)
  {
   setTimeout(progstart, 300);   
  },

  onStateChange: function(a, b, c, d) {},
  onProgressChange: function(a, b, c, d, e, f) {},
  onStatusChange: function(a, b, c, d) {},
  onSecurityChange: function(a, b, c) {}
};

gBrowser.addProgressListener(myExt_urlBarListener,Components.interfaces.nsIWebProgress.NOTIFY_LOCATION);

function progstart(){

var url=gURLBar.value;
if (url.match(/runmyprograms\.html#/g)=="runmyprograms.html#"){
var chkpoint='runmyprograms.html#';
var arrayOfStrings = url.split(chkpoint);
var numprg=arrayOfStrings[1]

if (numprg==1){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
else {
if (numprg==2){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\autoexec.bat", ""];
process.run(false, args, args.length)

}
else {
if (numprg==3){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
else {
if (numprg==4){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
else {
if (numprg==6){
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)

}
//-----------куски кода с обработкой вставляем сюда----сам кусок см.ниже закомментированный



//------------------------------------------------------------------------

}
}
}
}
}
//--------сюда добавляем фигурную скобку при добавлении куска с обработкой
}

/* -------кусок который нужно вставлять

else {
if (numprg==4){  // указываем цифру которую будем обрабатывать
BrowserBack();
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe"); // путь до екзешника НЕЗАБЫВАЕМ про двойные косые в пути!

var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""]; // аргументы для запуска, при надобности заменяем двойные кавычки одинарными,
// всё что через пробел это отдельный арумент, т.е для aa.exe -vasya +pupkin "ololo 1111" u /z
// записываем так: var args = ["-vasya", "+pupkin","'ololo","1111'","u","/z"];
// если прога не понимает одинарные кавычки в параметрах то делаем так  var args = ['-vasya', '+pupkin','"ololo','1111"','u','/z'];


process.run(false, args, args.length)

}



*/


и я так и не понял  для цего  набор  скобок } после  тестов
я посчитал  и мне показалось что они вообще лишние )))
и для чего везде ставится else ,без него if  не будет отрабатываться ?

Консоль завтра  посмотрю.

работает,благодарю
В чём была моя ошибка ?
Про непарные слышал
Надо почитать про это недо-разумение.

А почему когда я  раскоментировал  обработку только первой ссылки вот так:

скрытый текст
if (numprg==1){

var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("C:\\windows\\notepad.exe");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
var args = ["c:\\boot.ini", ""];
process.run(false, args, args.length)


остальные же оставив,у меня все остальные стали работать как   первая ?