VC++6での質問す。
◆やりたいこと◆
(1)内部から外部exeを引数ありで呼び出し、処理をさせます。
(2)その外部exeの結果コードを内部的に受け取り、エラー処理させます。
(3)外部exeの処理実行中は、できればDOS窓を非表示にさせます。
system()呼び出しは最も簡単なのですが、(3)が上手くできませんでした。
◆やってみた方法◆
こちらの過去質問も参考に見よう見まねでShellExecuteExを使ってやってみようとしました。
↓
SHELLEXECUTEINFO sei;
DWORDdwRC;
LPVOID msg;
BOOLres;
ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.nShow = SW_HIDE;
sei.lpVerb = (LPCTSTR)cmd;// cmdの中は、"hoge.exe param1 param2"
res=ShellExecuteEx( &sei );
WaitForSingleObject( sei.hProcess, INFINITE );
GetExitCodeProcess( sei.hProcess, &dwRC );
CloseHandle(sei.hProcess);
if(res != FALSE){
MessageBox( "OK", "result", MB_OK );
}else{
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dwRC,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &msg,
0,
NULL
);
MessageBox( msg, "result", MB_OK | MB_ICONERROR );
LocalFree(msg);
}
以上で実行しようとすると、
「指定されたファイルに対してこの操作を行うアプリケーションが関連付けられていません・・・」
のエラーになってしまいます。
どのように改善していけばよいでしょうか。
ソースはあちこちのものをミックスして書いていて、半分意味も分からずで、とんでもないことをしているかも知れません(VCは初心者で、ハンドルとかクラス、プロセスとかの知識に乏しいです)
また、まったく別で良い方法(CreateProcessの方が簡単だとか)があれば、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
SHELLEXECUTEINFO構造体に設定する値が間違っています。
この場合は下記の値を設定します。
sei.lpVerb = "open"
sei.lpFile = "hoge.exe"
sei.lpParameters = "param1 param2"
あとGetExitCodeProcess関数を使用するためにPROCESS_QUERY_INFORMATIONアクセス権を割り当てる必要があるのでOpenProcess関数を使用してアクセス権を割り当ててください。
この回答への補足
最終的に、CreateProcess()関数を使って、次のようにしています。
DWORD xxxDlg::ExecCmd(void* cmd){
STARTUPINFOsi;
PROCESS_INFORMATIONpi;
DWORDdwSysRC,dwExitCode;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
CreateProcess(NULL, (char*)cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, INFINITE);
dwSysRC=GetLastError();// CreateProcess関数としての戻り値
if(dwSysRC != 0){
SystemErrMsg(dwSysRC);// ユーザ作成関数
return(-1);
}
GetExitCodeProcess(pi.hProcess, &dwExitCode);//実行したコマンドそのものが返す戻り値
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return(dwExitCode);
}
ご回答ありがとうございました。遅くなりすみません。
>>あとGetExitCodeProcess関数を使用するためにPROCESS_QUERY_INFORMATIONアクセス権を…
この辺の用語や意味が理解できておらず、その辺りから勉強しないといけないかなと思っています。
とりあえず、CreateProcessのコードを他のソースから見様見まねで書いてみて、なんとなく動いているようです。(↑)
何かこちらも間違いがあれば、指摘お願いします。
No.1
- 回答日時:
ShellExecute() の使い方を誤っています。
この関数は exe を指定して起動するのではなく、
指定したファイルに関連付けてあるアプリを起動させるというものです。
たとえば aaaaa.txt を指定して実行するとメモ帳が立ち上がり aaaaa.txt を読み込む。また bbbb.xls を指定して実行すると Excel が立ち上がり bbbb.txt を読み込む。そういった動作になります。関連付けがなされてない場合はエラーになります(質問者さんの場合)
CreateProcess() を使うべきですが、パラメータの指定が面倒くさいので WinExec() を使ったらいかがでしょう。WinExecは互換性のために残されている関数なので薦めるべきではないかもしれませんが…(^^;
この回答への補足
早速のご回答ありがとうございました。
WinExec()を試してみたのですが、第2引数に
WinExec((const char*)cmd,SW_HIDE);
と指定することで、DOS窓を表示しないようには出来たのですが、
cmdで実行するexeそのものが返す戻り値を受けることができませんでした。
CreateProcessに挑戦でしょうか・・・
>>この関数は exe を指定して起動するのではなく、
>>指定したファイルに関連付けてあるアプリを起動させるというものです。
分かりやすいご説明ありがとうございました。すぐに納得できました。
私自身が、この辺のワンポイントがすぐに分かれば良いのですが、
どうもVCなどのヘルプ(特に英文)ではこの辺の”つかみ”が私のような初心者には分かり難い所です。
何か良いヘルプサイトなど、ご紹介頂ければと思います。
・・・
ということで、本題の方ですが、CreateProcessにて、
ここから呼び出すexe(lpCommandLine)そのものの戻り値は、CreateProcessの戻り値ではないですよね。
何かの引数(構造体)に入れられて戻ってくるとは思うのですが。もう少し調べてみたいと思います。
取り急ぎ、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
高校生はアルバイトするべきだろうか?賛成だったら「賛」、否定だったら「否」を文頭においてあなたの意見を教えてください。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
ShellExecuteの使い方について
JavaScript
-
ShellExecuteExでハンドルの取得
C言語・C++・C#
-
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
-
4
ShellExecuteが起動したプロセスのID
C言語・C++・C#
-
5
ShellExecuteでエクセルファイルが起動しません。
Visual Basic(VBA)
-
6
ShellExecuteでDOSコマンド実行したら...
C言語・C++・C#
-
7
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
8
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
9
プロセスIDからウィンドウハンドルを取得する方法
C言語・C++・C#
-
10
ShellExecute関数について(初心者です)
C言語・C++・C#
-
11
system関数がうまくいかない
C言語・C++・C#
-
12
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
13
ファイル内のデータを1行削除する方法
C言語・C++・C#
-
14
VC++での外部プログラムの実行
C言語・C++・C#
-
15
CString から LPCTSTRの型に変換
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
system関数(Windows)の戻り値!!
-
Win32コンソールプログラムをdl...
-
VB6.0 exe作成時に実行時エラー...
-
「読み込み違反」が起きたとき...
-
Visual Studio 「AnyCpu」について
-
VB2005 Vistaで印刷ができません
-
visual studio community2017 ...
-
VBA 最大化する方法
-
VBAにて指定したセルをプルダウ...
-
出力するプリンタを指定したい。
-
MSDOS(バッチファイル)でプロセ...
-
Internet ExplorerをC言語プロ...
-
C#ソースをCSCファイルにてコン...
-
オブジェクト(dll)のレジストリ...
-
Visual Source Safeについて
-
印刷ダイアログを表示させない方法
-
VBSでExcelファイル印刷時のプ...
-
LPRINTに相当するVBの関数は?
-
ManagementClassが見つからない。
-
VBscriptでPDFファイルを直接印...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「読み込み違反」が起きたとき...
-
Visual Studio 「AnyCpu」について
-
excel vbaから実行するexe実行...
-
Windows PowerShellでC言語を実...
-
C++初心者です。 debug asserti...
-
実行ファイル(.exe)が別のPC...
-
VBで「ファイル名を指定して実...
-
外部exe呼び出しの方法 ShellEx...
-
VB6.0 exe作成時に実行時エラー...
-
ActiveDirectoryから値を取得
-
JP1/File Transmission Server/...
-
C#VB、exeに埋め込んだexeの実行
-
一通ずつ処理したい(アウトル...
-
androidで.exeを実行できますか?
-
実行ファイルの動作について
-
ACCESSランタイムでエラー
-
mscorlib.dllの初回例外について
-
Format 関数のバグ?
-
コマンドライン引数について
-
VB.NetのWinsockについて
おすすめ情報