1

エラーコード2が表示されます。ファイルが見つかりません。しかし、私はフルパスを使用して、または使用せずに試しました。プロセスを開始することができず、私の間違いが何であるかわかりません。誰かがそれを指摘できますか?

これは完全なコードです:

#include "stdafx.h"
#include <map>
#include <psapi.h>
#include "shlwapi.h"

#define ERROR_FILE_NOT_FOUND = 2;

void Debug(char* path[])
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

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

    char* p = path[0];
    char* args = path[1];

    int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args, NULL, NULL, false, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi);

    if (!dwProcess)
    {
        DWORD dwLastErrorCode = GetLastError();
        printf("Error: %d", dwLastErrorCode);
    }

    DEBUG_EVENT debug_event = {0};
    DWORD dwContinueStatus  = DBG_CONTINUE;
    DWORD dwResume          = DBG_EXCEPTION_HANDLED;

    while (!WaitForDebugEvent(&debug_event, INFINITE))
    {
        switch(debug_event.dwDebugEventCode)
        {
            case EXCEPTION_DEBUG_EVENT:
            {
                EXCEPTION_DEBUG_INFO& exception = debug_event.u.Exception;

                if (exception.ExceptionRecord.ExceptionCode == 0x0EEDFADE && exception.dwFirstChance)
                    dwContinueStatus = dwResume;
            }
        }
        ContinueDebugEvent(debug_event.dwProcessId, debug_event.dwThreadId, dwContinueStatus);
    }
}

int main(char* argv[])
{
    char* p[2] = { "Notepad.exe", "args" };
    Debug(p);

    return 0;
}

助けていただければ幸いです。

4

3 に答える 3

4
int dwProcess = CreateProcess((LPCWSTR)p, (LPWSTR)args,

char*↑ にキャストしないでくださいwchar_t*

すべての C キャストを削除して、もっと幸せになりましょう。:-)

実際問題として、wchar_tWindows API の処理にはワイド文字列 ( -ベース) を使用してください。

Visual C++ でワイド文字プログラム引数を取得する簡単な方法 (ただし、このコンパイラに固有のものです) はwmain、 standard の代わりに使用することですmain


修正これがSOであることを忘れていました。では、 toをキャストすると実際に何が起こるのでしょうか?char*wchar_t*

Windows では、それぞれwchar_tが 2 バイトです。これは、事物がクラッシュしない場合、文字列内の連続する値の各ペアが 1 つの値charとして扱われることを意味します。ワイド文字列の null 終端は 2 つのゼロ バイトであるのに対し、文字列は 1 つのゼロ バイトしか保証しないため、クラッシュする可能性があるため、コードの観点からすると、文字列は無期限に続く可能性があります…wchar_tcharCreateProcess

要するに、キャストしないでください。

各キャストは、コンパイラーに「黙れ、コンパイラー、自分が何をしているかを本当に理解しているから、間違ってこれをやっているわけではない!」と言います。

そして、自分が何をしているのかを実際に知らない場合、その結果、大惨事を回避するのを助けようとし続けるツールを沈黙させることになります.

于 2012-11-08T23:35:40.390 に答える
2

だけではなく、絶対パスを使用する必要がありますnotepad.exeCreateProcessドキュメントから取得:

文字列は、実行するモジュールの完全なパスとファイル名を指定するか、部分的な名前を指定できます。部分的な名前の場合、関数は現在のドライブと現在のディレクトリを使用して指定を完了します。関数は検索パスを使用しません。このパラメーターには、ファイル名拡張子を含める必要があります。デフォルトの拡張子は想定されていません。

notepad.exeそのファイルも開きたい場合は、 のnotepad部分を繰り返す必要がありますlpCommandLine。同じページから:

lpApplicationName と lpCommandLine の両方が非 NULL の場合、lpApplicationName が指すヌル終了文字列は実行するモジュールを指定し、lpCommandLine が指すヌル終了文字列はコマンド ラインを指定します。新しいプロセスは、GetCommandLine を使用してコマンド ライン全体を取得できます。C で記述されたコンソール プロセスは、argc および argv 引数を使用してコマンド ラインを解析できます。argv[0] はモジュール名であるため、C プログラマーは通常、コマンド ラインの最初のトークンとしてモジュール名を繰り返します。

于 2012-11-08T23:32:53.883 に答える
1

パラメータ データに Ansi バッファを使用していますがCreateProcess()、Ansi バージョンではなく Unicode バージョンを呼び出しています。型キャストを取り除き (コンパイラーは、型キャストを使用していなければ間違いを警告していたはずです)、CreateProcessA()直接呼び出します:

//CreateProcess((LPCWSTR)p, (LPWSTR)args, ...);
CreateProcessA(p, args, ...);
于 2012-11-09T00:32:02.673 に答える