c++ - 将路径传递给 CreateProcessA

标签 c++ c winapi

我有一个函数,它读取注册表项,获取其中程序的路径,然后使用该路径作为第二个参数调用 CreateProcessA。调试应用程序时,失败并提示找不到该文件。

a) 是的,该文件存在 b) 是的,我有权执行该文件

问题:实际读取 reg 键并为 CreateProcessA 提供路径的函数,不会转义路径:这意味着,CreateProcessA 接收类似“C:\Program Files\prog.exe”的字符串,而不是“” C:\\Program Files\\prog.exe”。这是问题所在吗?是否存在任何 Windows 函数来自动转义所有反斜杠?

最佳答案

常见错误包括未将可执行文件的路径指定为 CreateProcess 的第一个参数,以及未在第二个参数中引用可执行文件的路径

CreateProcess( <exe path goes here> , <quoted exe path plus parameters goes here>, ... );

像这样:

std::wstring executable_string(_T("c:\\program files\\myprogram\\executable.exe"));
std::wstring parameters(_T("-param1 -param2"));

wchar_t path[MAX_PATH+3];
PathCanonicalize(path, executable_string.c_str());
path[sizeof(path)/sizeof(path[0]) - 1] = _T('\0');

// Make sure that the exe is specified without quotes.
PathUnquoteSpaces(path);
const std::wstring exe = path;

// Make sure that the cmdLine specifies the path to the executable using
// quotes if necessary.
PathQuoteSpaces(path);
std::wstring cmdLine = path + std::wstring(_T(" ")) + parameters;

BOOL res = CreateProcess(
                 exe.c_str(),
                 const_cast<wchar_t *>(cmdLine.c_str()),
                 ...);

我只是复制和改编了一些,所以上面可能会有一些错误,但想法是有的。确保在第一个参数中使用不带引号的路径,在第二个参数中使用带引号的路径,应该没问题。

关于c++ - 将路径传递给 CreateProcessA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11096801/

相关文章:

c++ - 质量错误传递 sizeof casted return

c++ - const 引用参数的默认值

C++ 类合并、链接器问题

c - 并行递归算法

c - 显示使用 asprintf 创建的时间字符串

c - 使用 perl 更新 C 文件中的宏

c++ - 如何在函数返回指针之前删除指针?

c++ - WndProc 作为类方法

c++ - VS2012下调试多个项目——主项目调用子项目

windows - 将窗口从后台进程带到前台