我目前正在尝试使用 CreateProcess() API 启动一个进程:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v=vs.85).aspx
我遇到的主要问题是子进程似乎是使用父进程的工作目录启动的,无论lpCurrentDirectory参数中指示了什么。
提供更多细节:lpCurrentDirectory 似乎适用于简单的命令行程序,但对于更复杂的程序(想想 GUI),它似乎没有考虑在内,因为所有资源依赖项都是从调用目录进程中搜索的。
我可以尝试来回切换调用进程的工作目录,但第二个问题是被调用进程未位于目标目录中。目前,它与调用进程位于同一目录中,尽管将来可能会更改。当我试图调用位于与父目录不同的目录中的子进程时,由于某种原因,它失败了。我已经多次检查目录结构,但到目前为止无济于事。
我一直在环顾四周(包括 SO),尽管有些人似乎抱怨同样的问题,但我目前还没有找到可用的解决方法。请注意,例如,我不能使用 ShellExec,它必须是 CreateProcess()。
万一这很重要,我当前的测试系统是 Windows 7 64 位。该软件应该可以在更广泛的操作系统上运行,从 XP 到 7、32 和 64 位(我猜 W8 暂时超出了范围)。
[编辑]我已经能够找到在调用进程工作目录之外调用子进程的解决方案。我为此使用了 lpApplicationName,这很好,但显然不需要引用,即使是涉及空格字符的复杂名称。
这使我能够在调用 CreateProcess( )之前测试修改调用进程的工作目录(使用SetCurrentDirectory())的想法。令我惊讶的是,它不起作用:工作目录实际上是在 lpApplicationName 的完整路径中指定的目录,无论由于 SetCurrentDirectory() 已为父工作目录设置了什么(并使用 GetCurrentDirectory() 进行了验证)
在我的情况下这是一个问题,因为我希望进程运行到另一个选定的目录(都指定到 lpCurrentDirectory 参数中,并且在 CreateProcess() 之前调用 SetCurrentDirectory())。