2016-11-28 6 views
0

Я кодирую программу как службу с помощью C++, когда я тестирую ее как обычную программу, функция GetCurrentDirectory возвращает правильный путь. Но когда я пытаюсь установить свою программу как службу, GetCurrentDirectory возвращает C:\Windows\System32 вместо пути исполняемого файла.GetCurrentDirectory на самом деле не возвращает путь к исполняемому файлу

Как я могу получить путь к исполняемому файлу таким образом, который будет работать для службы?

ответ

1

Рабочий каталог для служб Windows всегда %WINDIR%\System32.

Чтобы получить каталог, в котором находится исполняемый файл, просто вызовите GetModuleFileName с аргументом NULL для аргумента hModule и вручную отмените исполняемое имя.

+0

Thank you, It Work – duongtan

1

Поскольку %WinDir%\System32 является рабочим каталогом по умолчанию для 32-разрядной службы Windows (%WinDir%\SysWOW64 для 32-разрядных служб на 64-битной Windows).

Вы можете установить рабочий каталог своей службы на что-то еще, см. Также Windows Service: Can I configure the current working directory? или - лучше - не полагайтесь на свой код о рабочем каталоге. Несколько вариантов:

  • Прочтите его из реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\<service name>\ImagePath.
  • Использование WMI для перечисления услуг (если вы действительно хотите ...)
  • Использование GetModuleFileName(). Это простое в использовании, но будьте осторожны: у него есть хитрое поведение с WOW64, некоторыми средами виртуализации и svcshot хостинговых услуг (это немного старое, но вы можете прочитать this article.)
  • Используйте QueryServiceConfig().

Что я предлагаю:

  • Сохранить/загрузить данные в общей папке, известной, например, для общих данных приложений: SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath).