2011-09-16 37 views
0

CreateProcessを使用していますが、プロセスを開始できません。次のコードを使用していますが、「メモリの場所が無効です」というエラーが表示されます。 。 私のコードに問題はありますか?CreateProcessプロセスを開始できません。

#include <Windows.h> 
#include <stdio.h> 

//#include "common.h" 

int main(void) 
{ 

    DWORD creation_flags = DEBUG_PROCESS; 
    STARTUPINFO startupinfo; 
    PROCESS_INFORMATION process_information; 
    char *path_to_exe = "D:\\dbg\\calc.exe"; 


    startupinfo.dwFlags  = 0x1; 
    startupinfo.wShowWindow = 0x0; 


    startupinfo.cb = sizeof(startupinfo); 

    if(CreateProcess( path_to_exe, 
         NULL, 
         NULL, 
         NULL, 
         NULL, 
         creation_flags, 
         NULL, 
         NULL, 
         &startupinfo, 
         &process_information)){ 
     printf("We have successfully launched the process!\n"); 
     printf("[*] PID: %d\n", process_information.dwProcessId); 
    } 
    else 
     printf("[*] Error: %d.\n", GetLastError()); 
} 

答えて

2

startupinfo構造の3つのフィールドのみを入力しました。 残りのフィールドはゴミで満たされており、そのゴミの一部は悪い問題につながる可能性があります。

構造体を完全に初期化する必要があります。明示的にNULL、0、その他の空の値を指定する必要はありません。

+0

[MSDNのドキュメント](http://msdn.microsoft.com/en-us/library/ms682425.aspx)では、「* lpCommandLine *パラメータはNULLにすることができます。この場合、関数は文字列を使用します* lpApplicationName *がコマンドラインとして指しているので、問題の原因ではないはずです。 –

+2

すべてをゼロに初期化する最も簡単な方法は次のとおりです。STARTUPINFO startupinfo = {0}; – Ferruccio

+0

@Ferruccio:それはすべて0に初期化されます。しかし、それは必ずしも多くの場合に必要なものではないかもしれません。仮のフィールド "int timeout; //プロセスを中止するまでの秒数を考えてください。永遠に待機するには-1に設定してください。ゼロに設定すると、直ちに失敗します。 -1がそこに必要です。すべてをゼロにするブランケットは危険です。 – abelenky

1

スタートアップ情報構造をゼロにしてみてください。明示的なフラグを設定しなくても、メンバーの一部(例:lpTitle)が使用されます。

また、CreateProcessはアプリケーション名文字列に一時的に書き込むことがあるので、読み取り専用文字列リテラルを渡さないようにしてください。これは、少なくとも最近のバージョンのWindowsでは、機能のUnicode版でのみ発生します。

関連する問題