Я работаю над службой Windows, написанной на C ++ с использованием vs2005, и столкнулся с проблемой.
Служба должна запустить другой небольшой исполняемый файл и получить его вывод.Я делаю это через вызов CreateProcess (ну, на самом деле, библиотека делает это для меня (libexecstream)), он работает.
Запускаемый исполняемый файл находится где-то на диске, я не знаю, где, иего каталог находится в переменной окружения path.Мой сервис просто запускает "theTool.exe" и мы идем.
Если переменная пути выглядит так: smting;smthingelse;C:\Program Files\blah\bin;meow
она работает.
Но если путь выглядит так: smting;smthingelse;%ProgramFiles%\blah\bin;meow
больше не работает!
Проблема в том, что на некоторых машинах он выглядит как первый, на других - как второй ...
Самое смешное, что если я запускаю его в консоли (а не как сервис)все работает отлично!
Есть ли способ избежать этой проблемы?программно?Такое решение, как изменение его руками, не является вариантом (клиент не хочет его).Изменение его в скрипте установки или что-то подобное также не вариант, потому что впоследствии может быть изменен путь.
И изменение инструмента тоже не вариант, потому что мы этого не делали, и у нас нет источникакод.
edit: строка CreateProcess выглядит следующим образом:
STARTUPINFO si;
ZeroMemory( &si, sizeof( si ) );
si.cb=sizeof( si );
si.hStdError = err.w();
si.hStdOutput = out.w();
si.hStdInput = in.r();
si.dwFlags |= STARTF_USESTDHANDLES;
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof( pi ) );
if( !CreateProcess( 0, const_cast< char * >( command.c_str() ), 0, 0, TRUE, 0, 0, 0, &si, &pi ) ) {
throw os_error_t( "exec_stream_t::start: CreateProcess failed.\n command line was: "+command );
}
где command
- это "theTool"
2ndedit : если моя программа запускается как служба, она не работает, если она запускается в консоли, она работает