どうも、いつも拝見させて頂いております。
vb6のshellで他のexeを呼び出して実行するようなことをやっていますが、変な挙動で困ってます。
やりたいことはshellでプリンタを制御するexeをパラメータつけて実行し、印刷させたいですが、上手くいきません、殆どの実行が失敗します。但し、vbのデバッガで(ステップイン)実行した場合は成功します。
環境 Windows XPでvb6因みにプリンタはbrotherのラベルプリンターです。
ご存知の方教えてください。
宜しくお願いします。
> 殆どの実行が失敗します。
エラーが出るのか、何も起きないのか、期待動作しないのか、
具体的な状況を示してください。
それと、その別exe側から、何かエラーログのような物は
出力されないのでしょうか?
状況が不明瞭なので、どこから調査すべきか悩ましいですが、さしあたり、
開発環境と実行環境とで、異なるユーザ権限でログオンしてはいないかを
チェックしてください。
あとはコンパイルモード。コードの内容にもよりますが、開発環境だけで
成功する場合は、コンパイルモードをネイティブから Pコードに
変更することで対処できる可能性があります。
# Shell 関数が原因だとするなら、これは関係ない気もしますけれども。
それ以外では、実行時のパスを確認してみてください。
そのアプリが、何らかの依存ファイルを相対パスで参照している場合は、
ChDrive / ChDir を用いて、作業フォルダ(カレントディレクトリ)を
変更してやる必要があるかも知れません。
また、Shell 関数での実行の代わりに、WshShell.Run メソッドや
ShellExecute API での実行も検討してみてください。
魔界の仮面弁士さん、返信ありがとうございます。
実は呼び出しているEXEは昔作ってもらったもんです、ソースはもう見つかりません
ので、確認できません。
shellでの実行ですが、呼び出されたexeはプロセス一覧(タスクマネージャー)にありますので、呼び出しはできていると思います。
>エラーが出るのか、何も起きないのか、期待動作しないのか、
>具体的な状況を示してください。
呼び出されたプログラムはエラーが出ているというようなメッセージを表示されます、印刷はしてくれません。
>開発環境と実行環境とで、異なるユーザ権限でログオンしてはいないかを
>チェックしてください。
ユーザーの権限はアドミン権限ですので、権限の問題だと思えません。
あと絶対パス指定して実行しても、
WshShell.Run とShellExecute を試してもが同じ挙動です。
やはりexeのコンパイルの問題でしょうか?
> ソースはもう見つかりません
う〜む。その状況で原因を想像するのも、相当難しいような。(^_^;)
あと思いつくところだと、呼び出し側と呼び出される側とで共有している
外部データ(ファイル、データベース、クリップボード等)があった場合に、
それらの同時更新 or 書き込み遅延などが原因で、動作不良/データ不整合を
起こしている、とか……。
> 呼び出されたプログラムはエラーが出ているというようなメッセージを表示されます、印刷はしてくれません。
・起動する側がエラーを発しているのですか?
・起動される側がエラーを発しているのですか?
・起動されたexeの依存コンポーネントがエラーを発しているのですか?
・エラーが出ている「というような」、とは? 何故曖昧なのでしょう?
・エラーの具体的な内容は?
> デバッガで(ステップイン)実行した場合は
・開発環境からの実行時に、ステップ実行で止めたりはせず、
そのまま続けて実行した時の成否は?
エラーを発しているのは起動された側です。
それと呼び出された側の依存コンポーネントはありません、
やっていること印刷しかやってないので、
あるとしたらプリンターのドライバーだけです。
エラーメッセージは「エラーです」だけ表示されて、どんなエラーなのかは
表示されていません。
>開発環境からの実行時に、ステップ実行で止めたりはせず、
>そのまま続けて実行した時の成否は?
そのまま続けて実行した時は成功します。
先ほど試したことですが、プログラムを
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)を組み合わせるとうまくいきます。
不思議ですね。
もうちょっとほかの方法を探してみます、どうしてもだめなら、プリンター
の制御プログラムをもう一回作ってもらいます。
魔界の仮面弁士さんありがとうございました。
もしかして、非同期実行(プログラム実行終了を待たずに次行にいく)
のせいとか。
第3引数を指定して、
WshShell.Run(cmdLine,vbNormalForcus,True)
を一発だとどうなりますか?
第3引数は、
Trueだと終了するまで次の行に制御を移さない、
Falseだと起動と同時に次の行に制御を移す。
省略するとFalseです。
もげさん、アドバイスありがとうございます。
その通りやりましたが、だめでした。
PCとプリンタの通信インターフェースはRS-232Cで、
通信上の問題か、もしかしたらプリンター自体の問題かも知れません
(プリンターは古いので。メーカーのホームページを見ると廃盤になっている)
諦めました。
| ツイート |
|