Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2013, 15:46   #11
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

Путь определяется так:
Код:
path:=extractfilepath(paramstr(0))+'MyApp.exe'
Цитата:
Сообщение от astecenko Посмотреть сообщение
Может дело в пути к запускаемому приложению? Как он определяется?
Возможно нужно вызывать Wow64DisableWow64FsRedirection
Точно. Сейчас написал. завтра попробую отладить. Думаю-это оно и было.


Цитата:
Сообщение от waleri Посмотреть сообщение
Начните с того, что посмотрите какую ошибку возвращает ShellExecute()
Включил отлов ошибки. Почему-то небыло влючено.

Последний раз редактировалось Dee63; 10.04.2013 в 17:09.
Dee63 вне форума Ответить с цитированием
Старый 11.04.2013, 10:10   #12
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

итак, благодаря наводке astecenko я победил эту проблему.
адаптировал службу для работы в 32\64 бит версии. универсальность-это сила.

В первом приближении имеет вид такой
Код:
function MyService.Check64bit:boolean;
var
  IsWow64Process:function (hProcess: THandle; out Wow64Process:bool):bool; stdcall;
  wow64process:bool;
begin
  // проверка разрядности
  {$IF Defined(CPU64)}
  Result:=true;
  {$ELSEIF Defined(CPU16)}
  Result:=false;
  {$ELSE}
  isWow64Process:= GetProcAddress(GetModuleHandle(Kernel32), 'IsWow64Process');

  wow64Process:=false;
  if Assigned(IsWow64Process) then
    Wow64Process:=IsWow64Process(GetCurrentProcess, Wow64Process) and Wow64Process;
  result:=Wow64Process;
  {$IFEND}
end;


//запуск из  потока службы
var
  //64bit running
  dll: Hwnd;
  OldValue:pointer;
  Wow64Disable: function (v:pointer):integer; stdcall;
  wow64Enable: function (v:pointer):integer; stdcall;

begin
...
    if not(MyService.Check64bit) then
      try
        ShellExecute(GetDesktopWindow,'open',pansichar(path),nil,nil,SW_MINIMIZE);
        MyService.LogMessage('App start OK with x86 method',EVENTLOG_SUCCESS);
      except
        on e:exception do
          MyService.LogMessage('App start BAD with x86 method '+inttostr(GetLastError),EVENTLOG_ERROR_TYPE);
      end
    else
      //go running app in 64bit
      //disable wow64
      //run
      //enable wow64
      begin
        try
          oldValue:=nil;
          dll:=LoadLibrary('Kernel32.dll');
          @Wow64Disable:=getProcAddress(dll,'Wow64DisableWow64FsRedirection');
          @wow64Enable:=GetProcAddress(dll,'Wow64EnableWow64FsRedirection');
          Wow64Disable(@OldValue);
          try
            ShellExecute(GetDesktopWindow,'open',pansichar(path),nil,nil,SW_MINIMIZE);
            MyService.LogMessage('App start OK with x64 method',EVENTLOG_SUCCESS);
          except
            on e:exception do
              MyService.LogMessage('App start BAD with x64 method '+inttostr(GetLastError),EVENTLOG_ERROR_TYPE);
          end;
          wow64Enable(OldValue);
          FreeLibrary(dll);
        except
          on e:exception do
            MyService.LogMessage('App start BAD with x64 method; Exception; lastError '+inttostr(GetLastError),EVENTLOG_ERROR_TYPE);
        end;
      end;
Dee63 вне форума Ответить с цитированием
Старый 11.04.2013, 16:58   #13
consthab2
Новичок
Джуниор
 
Регистрация: 11.04.2013
Сообщений: 3
По умолчанию Может это поможет?

Проблема запуска процессов из службы - известная. Здесь предлагается вариант решения и исходники.
http://strongcpp.blogspot.ru/2013/04/blog-post_8.html

PS к статье. Когда одному из наших клиентов понадобилось запускать программу из службы, надежно заработало решение именно через sheduled tasks.
consthab2 вне форума Ответить с цитированием
Старый 18.04.2013, 11:26   #14
Dee63
Пользователь
 
Аватар для Dee63
 
Регистрация: 09.03.2010
Сообщений: 48
По умолчанию

Цитата:
Сообщение от consthab2 Посмотреть сообщение
Проблема запуска процессов из службы - известная. Здесь предлагается вариант решения и исходники.
http://strongcpp.blogspot.ru/2013/04/blog-post_8.html

PS к статье. Когда одному из наших клиентов понадобилось запускать программу из службы, надежно заработало решение именно через sheduled tasks.
Спасибо за ссылку.
Вариант интерактивного взаимодействия я себе сохраню.
Dee63 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows служба Лета Win Api 9 05.07.2012 13:06
windows служба welcomeTo C# (си шарп) 2 01.10.2011 03:38
Запуск Delphi- приложения при запуске стандартных программ Windows. Max_0 Общие вопросы Delphi 5 24.11.2010 18:29
Служба Windows Dezmont_ Win Api 7 30.04.2010 10:40
Windows Привязать запуск приложения к клавише. jojahti Windows 10 12.01.2010 17:15