5

Вопрос по winapi, c++ – Необработанная ошибка с CreateProcess [duplicate]

This question already has an answer here:

Я читал о функции CreateProcess в C ++, и я хотел попробовать это. Основная идея кода заключается в том, чтобы мой основной выполнял другой процесс (блокнот). На самом деле, это просто основной код. Когда я запускаю программу, я получаю:

First-chance exception at 0x752bb763 in createprocess.exe: 0xC0000005: Access violation writing location 0x00be57b8.
Unhandled exception at 0x752bb763 in createprocess.exe: 0xC0000005: Access violation writing location 0x00be57b8.

Когда я делаю точку останова, где происходит ошибка, я попадаю в tidtable.c (я думаю, для доступа к потокам). В частности, в tidtable.c наCRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue() Я действительно не знаю, что и как избежать этой проблемы. Ошибка возникает при вызове CreateProcess (т. Е. Он никогда не выводит & # x201C; из create & # x201D;).

Мой код:

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <strsafe.h>
#include <direct.h>
#include <string.h>
#include <conio.h>

int main(VOID)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

        //allocate memory
    ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));


fprintf(stderr, "This is just a test");

//create child process
if (!CreateProcess(NULL,
    L"C:\\Windows\\Notepad.exe",
    NULL,
    NULL,
    FALSE,
    0,
    NULL,
    NULL,
    &si,
    &pi))
{
        fprintf(stderr, "create process failed");

        return -1;
}
fprintf(stderr, "out of create");

    //parent waits for child to complete
WaitForSingleObject(pi.hProcess, INFINITE);

fprintf(stderr, "after wait");

printf("Child Complete");

    //close handle
CloseHandle(pi.hProcess);
//  CloseHandle(pi.hthread);

}

Если кто-нибудь знает, как преодолеть эту проблему, ваша помощь будет принята с благодарностью.

  • Только для версии Unicode! В версии ANSI этого нет, поскольку буфер с преобразованной строкой всегда доступен для записи.

    от
  • Это опечатка. CloseHandle (pi.hThread); C ++ чувствителен к регистру. Поэтому, пожалуйста, позаботьтесь о деле.

    от
  • Спасибо Эрвину, что решил это!

    от Favn Hghksd
  • Вы можете использовать intellisense, чтобы помочь вам.

    от
  • Теперь я раскомментировал последнюю строку кода: CloseHandle (pi.hthread), но я получаю эту ошибку: ошибка C2039: & h; : не является участником "_PROCESS_INFORMATION". Как мне это исправить. И благодарю вас

    от Favn Hghksd
  • Согласно документации, только юникодная версия функции пытается изменить строку. Поскольку в этом случае вам, похоже, не нужен юникод, вы также можете явно использовать версию ANSI CreateProcessA.

    от
  • Увидетьblogs.msdn.com/b/oldnewthing/archive/2009/06/01/9673254.aspx Я отредактировал это в ответе Эрвина.

    от 0xC0000022L
  • 17

    Проблема в том, что второй параметр

    CreateProcess Функция является параметром входа / выхода.

    Если вы укажете ее как строку, как вы это сделали, это будет константная строка, и функция при ее вызове не сможет записать в ячейку памяти, что приведет к нарушению доступа к памяти. Правильный способ - вызвать вашу функцию следующим образом:

    LPTSTR szCmdline = _tcsdup(TEXT("C:\\Windows\\Notepad.exe"));
    
    //create child process
    if (!CreateProcess(NULL,
        szCmdline,
        NULL,
        NULL,
        FALSE,
        0,
        NULL,
        NULL,
        &si,
        &pi))
    {
        fprintf(stderr, "create process failed");
    
        return -1;
    }
    

    Вы также можете прочитатьэта статья блога.

  • 1

    Скопируйте литерал в локальный массив и передайте его как 2-й аргумен

    2-й аргумент CreateProcess не может быть константой или литеральной строкой, потому что функция пытается изменить строку.т.