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で質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- JavaScript javascriptで入力フォームが空欄の時にアラートによるエラーを出すコードを書いています。 2 2023/06/13 17:58
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- その他(セキュリティ) 役所など、情報系システムのセキュリティが弱くても業務システムに問題ないか 3 2022/11/02 16:38
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 世界情勢 ロマノフ王家の財産は、マリヤ・ロマノフ大公女が引き継いだのですか? 1 2022/12/22 12:54
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
ShellExecuteの使い方について
JavaScript
-
ShellExecuteが起動したプロセスのID
C言語・C++・C#
-
-
4
ShellExecuteでDOSコマンド実行したら...
C言語・C++・C#
-
5
実行時のコマンドプロンプトを非表示 Visual C++
C言語・C++・C#
-
6
system関数がうまくいかない
C言語・C++・C#
-
7
charからLPTSTRへの変換方法
C言語・C++・C#
-
8
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
9
Windows PowerShellでC言語を実行、使えるようにするにはどうすれば良いですか?
C言語・C++・C#
-
10
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
11
API関数 GetExitCodeProcess
Visual Basic(VBA)
-
12
char*を初期化したいのですが
C言語・C++・C#
-
13
ShellExecuteでエクセルファイルが起動しません。
Visual Basic(VBA)
-
14
DOS窓の非表示
C言語・C++・C#
-
15
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
16
C++でboolにintの値を代入することについて
C言語・C++・C#
-
17
コマンド(例えばls)の出力結果を文字列で取得するプログラムの作成方法
C言語・C++・C#
-
18
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
19
CStringをwchar_tに変換したい
C言語・C++・C#
-
20
ファイル書込みで一行もしくは部分的に上書きする
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「読み込み違反」が起きたとき...
-
Visual Studio 「AnyCpu」について
-
Windows PowerShellでC言語を実...
-
C++初心者です。 debug asserti...
-
JP1/File Transmission Server/...
-
JP1から起動したexeでhttpリク...
-
Eclipse CDT MinGWによるC言語
-
ActiveX → VB を起動するとCre...
-
VB6 EXEとプログラムの違い
-
VB6.0 exe作成時に実行時エラー...
-
C#VB、exeに埋め込んだexeの実行
-
VBコンソールアプリケーション...
-
(msvcr71d.dll) でハンドルされ...
-
外部exe呼び出しの方法 ShellEx...
-
実行ファイル(.exe)が別のPC...
-
system関数(Windows)の戻り値!!
-
Format 関数のバグ?
-
excel vbaから実行するexe実行...
-
Designer.vbは直接コードをいじ...
-
vba 時間の引き算 例えば 15:00...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Visual Studio 「AnyCpu」について
-
excel vbaから実行するexe実行...
-
「読み込み違反」が起きたとき...
-
Windows PowerShellでC言語を実...
-
C++初心者です。 debug asserti...
-
Pythonのコードをexe化
-
実行ファイル(.exe)が別のPC...
-
VB6.0 exe作成時に実行時エラー...
-
C#VB、exeに埋め込んだexeの実行
-
外部exe呼び出しの方法 ShellEx...
-
VisualStudioでC#が実行できない
-
ActiveX → VB を起動するとCre...
-
androidで.exeを実行できますか?
-
ActiveDirectoryから値を取得
-
Format 関数のバグ?
-
system関数(Windows)の戻り値!!
-
C言語に詳しい人に質問です。
-
VS2008 の C++ で作成したEXEの...
-
ACCESSランタイムでエラー
-
WindowsXpでAppActivate
おすすめ情報