gpt4 book ai didi

c++ - 从服务运行程序

转载 作者:搜寻专家 更新时间:2023-10-31 00:45:26 24 4
gpt4 key购买 nike

我正在使用 vs2005 开发一个用 C++ 编写的 Windows 服务,但我遇到了一个问题。

该服务必须启动另一个小型可执行文件并获取它的输出。我通过调用 CreateProcess 来做到这一点(实际上是一个库为我做的 (libexecstream)),它有效。

正在启动的可执行文件在磁盘上的某处,我不知道在哪里,它的目录在路径环境变量中。我的服务刚刚启动“theTool.exe”,我们开始吧。
如果路径变量看起来像这样:smting;smthingelse;C:\Program Files\blah\bin;meow 它有效。
但如果路径看起来像这样:smting;smthingelse;%ProgramFiles%\blah\bin;meow 它不再有效!

问题是,在某些机器上它看起来像第一个,在其他机器上像第二个......
有趣的是,如果我在控制台(而不是服务)中启动它,它会正常工作!

有没有办法避免这个问题?以编程方式?像手动更改它这样的解决方案不是一种选择(客户不想要它)。在安装脚本或类似的东西中更改它也不是一个选项,因为之后可能会更改路径。
修改工具也不是一个选项,因为我们没有这样做,也没有源代码。

编辑: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”

第二次编辑:如果我的程序作为服务启动它失败,如果它在控制台中启动它工作

最佳答案

环境变量问题可能很棘手,尤其是当您谈论服务时。一些想法:

  1. 使用 process explorer验证进程以哪个用户身份运行。确保运行该服务的用户具有适当的环境变量设置(尽管这对于像 %programfiles 这样的普通用户来说应该不是问题)

  2. 如果您以某种方式以编程方式更改环境变量,则缓存 environment vars on startup 存在已知问题.

只是一些想法。

关于c++ - 从服务运行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6835911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com