【发布时间】:2016-05-23 13:17:45
【问题描述】:
我的简单程序需要帮助,该程序试图创建一个运行语音识别的新进程。
当我打开 cmd 并输入命令 C:\Windows\Speech\Common\sapisvr.exe -SpeechUX 时,语音识别将成功启动。即使通过基本上只是模仿 cmd 的system(C:\\Windows\\...) 运行,它也会启动。
但是,当使用 CreateProcess() 如下创建新进程时,该函数会失败。如果我将整个路径和参数放入第二个参数CreateProcess(NULL, TEXT("C:\\Windows...\\sapisvr.exe -SpeechUX"), ...),则会出现运行时异常:访问冲突写入位置
#include <windows.h>
int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(
TEXT("C:\\Windows\\Speech\\Common\\sapisvr.exe"), //Module name
TEXT(" -SpeechUX"), //command line params
NULL, //Process attributes
NULL, //Thread attributes
FALSE, //Handle inheritance
0, //No creation flags
NULL, //Use parent's environment
NULL, //Use parent's starting directory
&si, //Pointer to STARTUPINFO structure
&pi )) //Pointer to PROCESS_INFORMATION structure
{
printf("error creating process\n");
return 1;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
首先,我尝试使用带有参数的记事本来测试 CreateProcess 函数以打开现有文件。当我将 notepad.exe 的路径放入第一个参数并将文件名放入命令行参数时,它无法识别它并打开了一个新文件。
这一切也适用于尝试从我的程序运行 msconfig.exe,它不带任何参数,所以我猜问题出在其他地方,我只是不知道在哪里。 我在网上搜索并没有一个真正适合我的答案。我在 Windows 8.1 上使用 Visual Studio 2015。
感谢您的帮助。
【问题讨论】:
-
CreateProcess 的第二个参数必须是可写缓冲区,而不是字符串字面量。
-
@PaulMcKenzie:仅在调用
CreateProcessW()时,而不是在调用CreateProcessA()时。
标签: c++ windows winapi process accessibility