CreateProcess()函数无法运行。错误无法写入内存

时间:2017-09-12 12:40:09

标签: c++ visual-studio-2010 winapi console-application 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功能。

像这样

错误;

enter image description here

我的代码出了什么问题? 是因为我创建了控制台项目吗?

1 个答案:

答案 0 :(得分:2)

如果查找CreateProcess

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

我们可以注意到 lpCommandLine 定义为In- out 参数并且不是定义为const指针(与 lpApplicationName 比较,这是const指针LP <强> C TSTR)

和:

  

此功能的Unicode版本 CreateProcessW 可以修改   这个字符串的内容。因此,这个参数不能是一个   指向只读内存的指针(例如 const 变量或    literal 字符串)。如果此参数是常量字符串,则该函数可能会导致访问冲突。

但您确实将文字字符串 _T("_background_manipulator.exe")作为 lpCommandLine 传递。并获得例外结果 - 无法写入内存