Функция CreateProcess() не может быть запущена. Ошибка Невозможно записать память

Я использую Windows 8 x64 Enterprise, VS2010.

У меня проблема с CreateProcess().

Я создал проект консоли Win32 для выполнения _backround_manipulator.exe, моего приложения.

Реализация здесь.

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stdio.h>

DWORD RunManipulator(TCHAR* tszProcessPath);

int _tmain(int argc, _TCHAR* argv[])
{
    _tprintf(_T("---Manipulator will start...---\n"));
    if(0x08 == RunManipulator(_T("_background_manipulator.exe")))
        _tprintf(_T("---Manipulator Started.---\n"));
    else
        _tprintf(_T("---Manipulator cannot run.---\n"));
    return 0;
}

DWORD RunManipulator(TCHAR* tszProcessPath)
{
    STARTUPINFO _v_startupinfo;
    PROCESS_INFORMATION _v_processinfo;
    ZeroMemory(&_v_startupinfo, sizeof(STARTUPINFO));
    ZeroMemory(&_v_processinfo, sizeof(PROCESS_INFORMATION));

    _v_startupinfo.cb = sizeof(STARTUPINFO);

    if (!CreateProcess(NULL, tszProcessPath, NULL, NULL, FALSE, 0, NULL, NULL, &_v_startupinfo, &_v_processinfo));
    {
        return 0x12;
    }

    return 0x08;
}

Но не может передать функцию CreateProcess(NULL, tszProcesPath, /*...*/) в режиме debug.

Ошибка вроде этой;

введите здесь описание изображения

Что не так в моем коде? Это потому, что я создал консольный проект?


person G.Alexander    schedule 12.09.2017    source источник
comment
Вы пытались использовать отладчик шаг за шагом и найти, какая строка вызывает ошибку?   -  person roalz    schedule 12.09.2017
comment
Я не могу передать функцию CreateProcess.   -  person G.Alexander    schedule 12.09.2017
comment
1) У вас есть точка с запятой после if, что, я думаю, не является желаемым поведением. 2) Добавление GetLastError в случае отказа сообщает ERROR_FILE_NOT_FOUND. У вас есть _background_manipulator.exe в пути?   -  person karastojko    schedule 12.09.2017
comment
Спасибо, @karastojko. Прочтите внимательно мою проблему. 1) Вы установили ту же среду, что и я? Я имею в виду ConsoleProject. 2) Такая же ошибка возникает после замены _background_manipulator.exe на calc.exe.   -  person G.Alexander    schedule 12.09.2017
comment
ваш tszProcesPath доступен только для чтения. что тут непонятного? тривиальная ошибка   -  person RbMm    schedule 12.09.2017
comment
@RbMm, спасибо. Я не могу понять, почему tszProcessPath доступен только для чтения. Вы знаете, почему это происходит? Я ничего не делал с tszProcessPath.   -  person G.Alexander    schedule 12.09.2017
comment
@A.Godnov: Спасибо за замечание - обычно я читаю вопрос и пробую данный код. Работает при использовании calc.exe (в режиме консоли).   -  person karastojko    schedule 12.09.2017
comment
строковые литералы, такие как _background_manipulator.exe, обычно находятся в разделе только для чтения, помещенном в .rdata   -  person RbMm    schedule 12.09.2017
comment
Связаны ли атрибуты Readonly, Writeonly с CreateProcess? Похоже, что атрибут Writeonly не имеет значения. Я должен просто читать и писать? Пожалуйста, расскажите мне больше.   -  person G.Alexander    schedule 12.09.2017
comment
@karastojko, я очень рад, что вы хорошо работаете с кодом. Но я действительно не знаю, почему возникает эта ошибка. Я ищу причину, потому что я не могу выполнить указанный процесс. Я думаю, что сейчас что-то появится, от мистера RbMm.   -  person G.Alexander    schedule 12.09.2017
comment
Зачем использовать TCHAR? Вы действительно поддерживаете Windows 95?   -  person David Heffernan    schedule 12.09.2017


Ответы (1)


если искать определение CreateProcess< /а>

BOOL WINAPI CreateProcess(
  _In_opt_    LPCTSTR               lpApplicationName,
  _Inout_opt_ LPTSTR                lpCommandLine,
  ...

мы можем заметить, что lpCommandLine определяется как параметр In-out и определяется не как константный указатель (сравните с lpApplicationName, который является константным указателем LP CTSTR)

а также :

Версия этой функции Unicode, CreateProcessW, может изменять содержимое этой строки. Следовательно, этот параметр не может быть указателем на постоянную память (такую ​​как константная переменная или литеральная строка). Если этот параметр является постоянной строкой, функция может вызвать нарушение прав доступа.

но вы точно передаете литеральную строку _T("_background_manipulator.exe") как lpCommandLine. и получил исключительный результат - память не может быть записана

person RbMm    schedule 12.09.2017
comment
Спасибо. Я только что решил проблему, используя другую переменную TCHAR. Точка ; _tcscpy(tszCommandLine, tszProcessPath); Спасибо за вашу доброту. - person G.Alexander; 12.09.2017
comment
@RbMm это обман сотни раз, возможно, лучше закрыть как таковой - person David Heffernan; 12.09.2017