6

私はC++のCreateProcess関数について読んでいて、それを試してみたかったのです。コードの基本的な考え方は、メインに別のプロセス(メモ帳)を実行させることです。本当に、それはただの基本的なコードです。プログラムを実行すると、次のようになります。

createprocess.exeの0x752bb763でのファーストチャンス例外:0xC0000005:アクセス違反の書き込み場所0x00be57b8。
createprocess.exeの0x752bb763で未処理の例外:0xC0000005:アクセス違反の書き込み場所0x00be57b8。

エラーが発生する場所のブレークポイントを作成すると、tidtable.c(スレッドにアクセスするためのものだと思います)に移動します。特にtidtable.cでは、 CRTIMP PFLS_GETVALUE_FUNCTION __cdecl __set_flsgetvalue() この問題を回避する方法や方法がわかりません。このエラーは、CreateProcess呼び出しで発生します(つまり、「out ofcreate」を出力することはありません)。

私のコードは次のとおりです。

#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);

}

誰かがこの問題を克服する方法を知っているなら、あなたの助けをいただければ幸いです。

4

2 に答える 2

19

問題は、CreateProcess関数の2番目のパラメーターがin/outパラメーターであるということです。

行ったように文字列として指定すると、定数文字列であり、呼び出されたときの関数はメモリ位置に書き込めないため、メモリアクセス違反が発生します。正しい方法は、次のように関数を呼び出すことです。

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;
}

このブログ記事も読むことをお勧めします。

于 2012-04-06T13:44:17.707 に答える
1

funcが文字列を変更しようとするため、CreateProcessの2番目の引数をconstまたはリテラル文字列にすることはできません。リテラルをローカル配列にコピーし、それを2番目の引数として渡します。

于 2012-04-06T13:46:51.883 に答える