vb6で他のexeを実行するには?


kiyo  2007-03-07 16:23:44  No: 98238

どうも、いつも拝見させて頂いております。
vb6のshellで他のexeを呼び出して実行するようなことをやっていますが、変な挙動で困ってます。
やりたいことはshellでプリンタを制御するexeをパラメータつけて実行し、印刷させたいですが、上手くいきません、殆どの実行が失敗します。但し、vbのデバッガで(ステップイン)実行した場合は成功します。
環境  Windows XPでvb6因みにプリンタはbrotherのラベルプリンターです。
ご存知の方教えてください。
宜しくお願いします。


魔界の仮面弁士  2007-03-07 17:08:19  No: 98239

> 殆どの実行が失敗します。
エラーが出るのか、何も起きないのか、期待動作しないのか、
具体的な状況を示してください。

それと、その別exe側から、何かエラーログのような物は
出力されないのでしょうか?


状況が不明瞭なので、どこから調査すべきか悩ましいですが、さしあたり、
開発環境と実行環境とで、異なるユーザ権限でログオンしてはいないかを
チェックしてください。

あとはコンパイルモード。コードの内容にもよりますが、開発環境だけで
成功する場合は、コンパイルモードをネイティブから Pコードに
変更することで対処できる可能性があります。
# Shell 関数が原因だとするなら、これは関係ない気もしますけれども。

それ以外では、実行時のパスを確認してみてください。
そのアプリが、何らかの依存ファイルを相対パスで参照している場合は、
ChDrive / ChDir を用いて、作業フォルダ(カレントディレクトリ)を
変更してやる必要があるかも知れません。

また、Shell 関数での実行の代わりに、WshShell.Run メソッドや
ShellExecute API での実行も検討してみてください。


kiyo  2007-03-07 17:38:02  No: 98240

魔界の仮面弁士さん、返信ありがとうございます。
実は呼び出しているEXEは昔作ってもらったもんです、ソースはもう見つかりません
ので、確認できません。
shellでの実行ですが、呼び出されたexeはプロセス一覧(タスクマネージャー)にありますので、呼び出しはできていると思います。
>エラーが出るのか、何も起きないのか、期待動作しないのか、
>具体的な状況を示してください。
呼び出されたプログラムはエラーが出ているというようなメッセージを表示されます、印刷はしてくれません。
>開発環境と実行環境とで、異なるユーザ権限でログオンしてはいないかを
>チェックしてください。
ユーザーの権限はアドミン権限ですので、権限の問題だと思えません。

あと絶対パス指定して実行しても、
WshShell.Run とShellExecute を試してもが同じ挙動です。
やはりexeのコンパイルの問題でしょうか?


魔界の仮面弁士  2007-03-07 19:35:37  No: 98241

> ソースはもう見つかりません
う〜む。その状況で原因を想像するのも、相当難しいような。(^_^;)

あと思いつくところだと、呼び出し側と呼び出される側とで共有している
外部データ(ファイル、データベース、クリップボード等)があった場合に、
それらの同時更新 or 書き込み遅延などが原因で、動作不良/データ不整合を
起こしている、とか……。


> 呼び出されたプログラムはエラーが出ているというようなメッセージを表示されます、印刷はしてくれません。

・起動する側がエラーを発しているのですか?
・起動される側がエラーを発しているのですか?
・起動されたexeの依存コンポーネントがエラーを発しているのですか?

・エラーが出ている「というような」、とは? 何故曖昧なのでしょう?
・エラーの具体的な内容は?

> デバッガで(ステップイン)実行した場合は

・開発環境からの実行時に、ステップ実行で止めたりはせず、
 そのまま続けて実行した時の成否は?


kiyo  2007-03-07 22:18:33  No: 98242

エラーを発しているのは起動された側です。
それと呼び出された側の依存コンポーネントはありません、
やっていること印刷しかやってないので、
あるとしたらプリンターのドライバーだけです。
エラーメッセージは「エラーです」だけ表示されて、どんなエラーなのかは
表示されていません。
>開発環境からの実行時に、ステップ実行で止めたりはせず、
>そのまま続けて実行した時の成否は?
そのまま続けて実行した時は成功します。
先ほど試したことですが、プログラムを
 cmdLine="実行プログラム名 引数1 引数2"
 WshShell.Run(cmdLine,vbNormalForcus)
 Shell(cmdLine,vbNormalForcus)
2回連続呼び出すように書いてコンパイルして実行したら、問題なく印刷されました。
Shell(cmdLine,vbNormalForcus)を2行書いても、
WshShell.Run(cmdLine,vbNormalForcus)を2行書いてもだめなのに、
WshShell.Run(cmdLine,vbNormalForcus)と
Shell(cmdLine,vbNormalForcus)を組み合わせるとうまくいきます。
不思議ですね。
もうちょっとほかの方法を探してみます、どうしてもだめなら、プリンター
の制御プログラムをもう一回作ってもらいます。
魔界の仮面弁士さんありがとうございました。


もげ  2007-03-08 15:09:52  No: 98243

もしかして、非同期実行(プログラム実行終了を待たずに次行にいく)
のせいとか。

第3引数を指定して、
WshShell.Run(cmdLine,vbNormalForcus,True)
を一発だとどうなりますか?

第3引数は、
Trueだと終了するまで次の行に制御を移さない、
Falseだと起動と同時に次の行に制御を移す。
省略するとFalseです。


kiyo  2007-03-08 17:03:04  No: 98244

もげさん、アドバイスありがとうございます。
その通りやりましたが、だめでした。
PCとプリンタの通信インターフェースはRS-232Cで、
通信上の問題か、もしかしたらプリンター自体の問題かも知れません
(プリンターは古いので。メーカーのホームページを見ると廃盤になっている)
諦めました。


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加