2011-01-02 10 views
1

二重引用符をCreateProcess関数に送信します。どうすれば正しい方法で対応できますか?この文字をすべて送信します: "%h"CreateProcessが抽出された値を返さない

CreateProcess(L"C:\\identify -format ",L"\"%h\" trustedsnapshot.png",0,0,TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo); 

注:「識別する」はイメージ作成プログラムです。

int ExecuteExternalFile()  
{ 
SECURITY_ATTRIBUTES secattr; 
ZeroMemory(&secattr,sizeof(secattr)); 
secattr.nLength = sizeof(secattr); 
secattr.bInheritHandle = TRUE; 

HANDLE rPipe, wPipe; 

//Create pipes to write and read data 

CreatePipe(&rPipe,&wPipe,&secattr,0); 

STARTUPINFO sInfo; 
ZeroMemory(&sInfo,sizeof(sInfo)); 
PROCESS_INFORMATION pInfo; 
ZeroMemory(&pInfo,sizeof(pInfo)); 
sInfo.cb=sizeof(sInfo); 
sInfo.dwFlags=STARTF_USESTDHANDLES; 
sInfo.hStdInput=NULL; 
sInfo.hStdOutput=wPipe; 
sInfo.hStdError=wPipe; 

CreateProcess(L"C:\\identify",L" -format \"%h\" trustedsnapshot.png",0,0,TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo); 



CloseHandle(wPipe); 

char buf[100]; 
DWORD reDword; 
CString m_csOutput,csTemp; 
BOOL res; 
do 
{ 
    res=::ReadFile(rPipe,buf,100,&reDword,0); 
    csTemp=buf; 
    m_csOutput+=csTemp.Left(reDword); 
}while(res); 

//return m_csOutput; 
float fvar; 
//fvar = atof((const char *)(LPCTSTR)(m_csOutput)); ori 


//fvar=atof((LPCTSTR)m_csOutput); 
fvar = _tstof(m_csOutput); 

const size_t len = 256; 
wchar_t buffer[len] = {}; 
_snwprintf(buffer, len - 1, L"%d", fvar); 


MessageBox(NULL, buffer, L"test print createprocess value", MB_OK); 

return fvar; 
} 

私はCreateProcessをから整数値を返すために、この機能を必要とする:

はここで完全なコードです。

+0

これで動作します。私は、実行ファイルが* .exeをその名前の末尾に置く必要があることに気付きました。したがって、この場合:identify.exe – karikari

答えて

1

あなたの書き方はうまくいくはずですか、それとも問題はありますか?

+0

私のプロジェクトはコンパイルできますが、メッセージボックスにダンプしたときに期待した値が返されないようです。出力は整数でなければなりません。 – karikari

+0

私はちょうど気づいた - なぜあなたは最初のパラメータで-formatを渡していますか?それは実行可能ファイルへのパスのみを渡す必要があります "C:\ identify –

+0

まだ期待された結果が得られていません私の質問を編集しました.. – karikari

1

あなたの問題は引用符ではありません。 CreateProcessにパラメータを渡す方法には2つの問題があります。最初は、2番目の引数に渡されるコマンドラインにコマンドの名前が含まれている必要があります(つまり、 "argv [0]"の値を含める必要があります)。2番目はリダイレクト(> testt.txt)がCreateProcess APIによって処理されません。 c:\ identifyがそのような引数を必要としない限り、これをコマンドラインに含めてはいけません。

+0

私はその部分を捨ててしまいました。" -format "ウィンドウズコマンドターミナルでは "currentsnapshot.png"コマンドを実行しますが、CreateProcessから実行すると動作しません。 – karikari

+0

CreateProcessを試してください(NULL、L "-format \"%h \ "trustedsnapshot.png"、0,0、TRUE、 NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW、0,0、&sInfo、&pInfo); – John

関連する問題