gpt4 book ai didi

c++ - 在 C++ 中使用 CreateProcess() 启动语音识别

转载 作者:可可西里 更新时间:2023-11-01 14:48:49 28 4
gpt4 key购买 nike

我的简单程序需要帮助,它试图创建一个运行语音识别的新进程。当我打开 cmd 并输入命令 C:\Windows\Speech\Common\sapisvr.exe -SpeechUX 时,语音识别将成功启动。它甚至会在通过 system(C:\\Windows\\...) 运行时启动,这基本上只是模仿 cmd。但是,当使用如下所示的 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函数有第二个参数作为 LPTSTR。对于此函数的 CreateProcessW 版本,这必须是可写缓冲区,而不是字符串文字。因此,您的程序的行为是未定义的。由于您在调用 CreateProcess 时遇到写入某个位置的访问冲突,我们将假定 CreateProcess 正在映射到 CreateProcessW

在发布的链接中,引用如下:

The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation.

所以修复只是定义一个数组,而不是文字:

TCHAR commandParam[] = TEXT(" -SpeechUX");

if (!CreateProcess(TEXT("C:\\Windows\\Speech\\Common\\sapisvr.exe"),
commandParam,
...
}

或者如果传递 NULL 作为第一个参数:

TCHAR commandParam[] = TEXT("C:\\Windows\\Speech\\Common\\sapisvr.exe");
//...
if (!CreateProcess(NULL, commandParam, ...

此外,如果 CreateProcess 返回错误,您应该调用 GetLastError和可选的 FormatMessage , 获取发生的错误,而不是简单地输出有错误。

关于c++ - 在 C++ 中使用 CreateProcess() 启动语音识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35361776/

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