2017-07-04 20 views
-2

プロセス(calc.exe)を作成しようとしましたが、プログラムが正しく実行されません。開始後にクラッシュするだけです。問題はLPWSTR変数ですが、修正する方法はわかりません。CreateProcessが失敗しました。予期しないエラー

以下は私のコードです。

#include "stdafx.h" 
#include <Windows.h> 
#include <cstdio> 
#include <string> 


using namespace std; 

void NewProcess(LPWSTR cmd) { 

    printf("Argv Inside funcion: %s\n", cmd[1]); 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

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

    if (!CreateProcess(NULL, 
     cmd,  
     NULL, 
     NULL, 
     FALSE,  
     0,    
     NULL,  
     NULL,  
     &si,   
     &pi)   
     ) 
    { 
     printf("CreateProcess failed (%d).\n", GetLastError()); 
     return; 
    } 

    printf("Process ID: %d Started", pi.dwProcessId); 

    WaitForSingleObject(pi.hProcess, INFINITE); 
    printf("\nProcess ID: %d Terminated!", pi.dwProcessId); 


    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 

void main(int argc, TCHAR *argv[]) 
{ 
    char text[] = "calc.exe"; 
    wchar_t wtext[20]; 
    mbstowcs(wtext, text, strlen(text) + 1); 
    LPWSTR ptr = wtext; 

    NewProcess(ptr); 
    getchar(); 
} 
+3

CおよびC++「AREN同じ言語を使う。適切なものだけを使ってタグ付けする。 – tambre

+1

正確にどこがクラッシュしますか?デバッガの下でプログラムを実行する場合は、正確なコード位置とその場所(呼び出しスタック)につながる関数呼び出しのシーケンスがわかります。 – zett42

+0

解決済み...悪いです。ソーリー。問題はwprintf( "Argv Inside functions:%s \ n"、cmd [1])にありました。この行のeditidコードを忘れてしまった。cmdが配列だったので、cmd [1]に問題があった。 – bielu000

答えて

1

あなたprintfは(非ワイド)C列へのポインタとして、コマンドの最初の文字を解釈しています。

使用

wprintf(L"Argv Inside funcion: %s\n", cmd); 

、あなたはそんなにmainを複雑にする必要はありません("calc.exe"にはマルチバイト文字はありませんので、変換するものは何もありません):

int main(int argc, TCHAR *argv[]) 
{ 
    auto application[] = L"calc.exe"; 
    NewProcess(application); 
    getchar(); 
} 
+0

あなたは絶対にそうです、私は編集コード中にこの行を見逃しました。ありがとう – bielu000

+0

しかし、もう一つ質問があります。 "mbstowcs(wtext、text、strlen(text)+ 1);"を使うのは良い習慣ですか?関数 ?私が解決策を探していたとき、LPWSTR varを初期化する他の方法がありましたが、この方法はありませんでした。この機能は他の方法よりも使いやすいので、これは私にとっては変です。 – bielu000

+0

@ bielu000ワイド文字列リテラルを使用してください: 'wchar_t wtext [] = L" calc.exe ";' 'ptr'変数は、配列が' NewProcess(wtext) 'を呼び出すだけで自動的にポインタに崩壊するので、廃止されました。 – zett42

関連する問題