在 C++ 中使用 CreateProcess() 启动语音识别
Starting Speech Recognition with CreateProcess() in C++
我需要帮助我的简单程序,该程序尝试创建一个运行语音识别的新进程。当我打开cmd并输入命令C:WindowsSpeechCommonsapisvr.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 processn");
return 1;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
首先,我尝试使用运行记事本来测试CreateProcess函数,并带有打开现有文件的参数。当我将记事本的路径.exe第一个参数和文件名放在命令行参数中时,它无法识别它并打开一个新文件。
这整个也适用于尝试从我的程序运行msconfig.exe,它不需要任何参数,所以我想问题出在其他地方,我只是不知道在哪里。我在网上搜索了一下,没有一个答案实际上对我有用。我在Windows 8.1上使用Visual Studio 2015。
感谢您的帮助。
CreateProcess 函数有第二个参数作为LPTSTR
。 对于此函数的CreateProcessW
版本,这必须是可写缓冲区,而不是字符串文本。 因此,程序的行为是未定义的。 由于您在调用 CreateProcess
时收到写入位置的访问冲突,我们将假设CreateProcess
正在映射到 CreateProcessW
。
在发布的链接中,这是报价:
此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。因此,此参数不能是指向只读内存(如 const 变量或文本字符串(的指针。如果此参数是常量字符串,则该函数可能会导致访问冲突。
因此,解决方法只是定义一个数组,而不是文字:
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,以获取发生的错误,而不是简单地输出存在错误。
- 谷歌语音识别不起作用,因为冲突线程Qt C++
- 如何使用口袋狮身人面像通过代码中的麦克风进行语音识别
- ROS语音识别
- Windows生物识别框架样本UMDF驱动程序:此设备无法启动.(代码10)
- 谷歌语音识别(cpp示例):对AssignDescriptors()的未定义引用
- 针对有限数量的命令的快速语音识别
- 使用 HMM 或 MFCC 进行语音识别
- 语音识别 - 线性预测编码
- 在 C++ 中使用 CreateProcess() 启动语音识别
- 来自文件的窗口语音识别 (SAPI) 的质量
- 使用Hopfield神经网络读取WAV文件的数据部分以进行语音识别
- C++:如何识别您的程序是从Visual Studio启动的,而不是从操作系统启动的
- 在SAPI 5.3中禁用主语音识别
- c++语音识别API
- 无法同时运行 kinect 语音、姿势和手势识别
- 启动Process并稍后识别它
- 已知有限字典的语音识别库
- 无法启动程序,windowsweb服务框架中出现无法识别的错误
- 语音识别SDK/API和Windows 8商店应用程序(c++)
- 语音识别小词汇量(约20个单词)