windows — Запуск распознавания речи с помощью CreateProcess () в переполнении стека

Мне нужна помощь с моей простой программой, которая пытается создать новый процесс с распознаванием речи.
Когда я открываю 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 из моей программы, которая не принимает никаких параметров, поэтому я думаю, что проблема в другом месте, я просто не знаю, где.
Я искал в Интернете, и ни один из ответов на самом деле не работал для меня. Я работаю в Visual Studio 2015 на Windows 8.1.

Спасибо за помощь.

3

Решение

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, чтобы получить ошибку, а не просто вывести, что есть ошибка.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector