shell関数がOSによってエラーになる

解決


なお  2007-04-17 21:47:47  No: 98575

shell関数でsetup.exeを起動するファイルを作成し動作確認したところ、

   WindowsXPでは動作OK、
   Windows2000では動作OK、
   Windows98SEではエラー53、ファイルが見つかりません、

のエラーメッセージが表示されています。
以下の構文が間違っているのか、
動作確認したOS(98SE)に不足なDLLファイルがあるのかよくわからず困っています。

Private Sub Command1_Click()

    Call Shell(App.Path & "\setup.exe") 

    Unload Form1
    
End Sub

当方の知識不足なだけかと思いますが
ご指摘をお願いします。


なお  2007-04-17 21:52:43  No: 98576

追記:VBのバージョンは6.0です。


大吉末吉  2007-04-17 21:57:20  No: 98577

2点確認です。

(1)
その「setup.exe」は、Shell関数からではなく、直接エクスプローラから実行した場合、
Win98SEでも動作するんでしょうか?

#直接実行しても、動作しないなら、VBの問題じゃないですよね。

また、その「setup.exe」は何で作成されたファイルなんでしょうか?

VB6?VC++?セットアップ作成ツール?

(2)
App.Pathに空白が含まれていませんか?

もし含まれているなら、(Program Files等)
>     Call Shell("""" & App.Path & "\setup.exe""") 
とすると、どうなります?


なお  2007-04-17 22:30:44  No: 98578

大吉末吉様、ご回答有り難うございます。

(1)
直接エクスプローラからSetup.exeをダブルクリックした際は正常に起動します。

Setup.exeはInstallShieldです。

(2)
App.Pathに空白は含まれていませんが
"_"(アンダーバー)が含まれています。問題ありますでしょうか?

よろしくお願い致します。


魔界の仮面弁士  2007-04-17 22:47:48  No: 98579

カレントドライブ・カレントディレクトリについても確認してみるとか。


なお  2007-04-17 23:01:52  No: 98580

魔界の仮面弁士様、ご回答有り難うございます。

調べているうちに原因がわかりましたが、解決策が見つかりません。

原因はCDから実行していますが、HDDにコピーして実行ファイルの
読み取り専用を外して実行すると正常に動作しました。

実行ファイルが読み取り専用になっているのが原因のようです。
しかし、CDに書き込んだ時点で読み取り専用になってしまうため、
この問題の解決策が見つからない状態です。

読み取り専用になっても正常に動作出来る術はあるのでしょうか?


魔界の仮面弁士  2007-04-17 23:25:14  No: 98581

もう少し調査が必要かも。

1. HDD にコピーして、ファイルを読取専用にしてみた場合はどうなるか。

2. HDD にコピーして、フォルダを読取専用にしてみた場合はどうなるか。

3. CD 実行で、カレントディレクトリを CD 上にしてみた場合はどうなるか。

4. CD 実行で、カレントディレクトリを HDD 上にしてみた場合はどうなるか。


魔界の仮面弁士  2007-04-17 23:29:36  No: 98582

もう一点。

>  Call Shell(App.Path & "\setup.exe") 

exe がルートディレクトリ上にある場合、App.Path は、
"C:\" のように最後に "\" が含まれるのですが、exe が
下位のディレクトリ上にある時には、最後に "\" が
付加されないという点にも注意してみてください。


ささ  2007-04-18 01:17:26  No: 98583

案外

Call Shell(App.Path & "\setup.exe") 

Call Shell(chr(34) & App.Path & "\setup.exe" & chr(34))
で動くようになったりしないですかね?

まぁ、最初に確認してるとは思うけれど


なお  2007-04-18 04:46:51  No: 98584

皆様からのアドバイスを頂き、
いろいろ試しているうちに頭がウニのようになり、
テストしたCD枚数は膨大になってしまいましたが
おかげさまで糸口が見つかりそうです。

最終的にわかったことは
CDから実行した場合、

WindowsXP/2000は
Call Shell(App.Path & "\setup.exe")
で動作しました。

Windows98SE/MEは
Call Shell(App.Path & "setup.exe")
で動作しました。

ただし、Windows98SE/MEはHDDから起動した場合、
Call Shell(App.Path & "\setup.exe")
で動作するようです。
(読み取り専用は、最初はエラーになりましたが、
読み取り専用のチェックを付けたり外したりしているうちに
エラーにならなくなりました)

いずれにしてもCDから起動したいので
Call Shell(App.Path & "\setup.exe")と
Call Shell(App.Path & "setup.exe")を
OSを自動判別して切り替えて使用したいのですが
何か良い方法はありますでしょうか?


魔界の仮面弁士  2007-04-18 06:14:30  No: 98585

> WindowsXP/2000は
> Call Shell(App.Path & "\setup.exe")
> で動作しました。

逆に質問します。
XP/2000 において、
  Call Shell(App.Path & "setup.exe")
では動作するのでしょうか? しないのでしょうか?
動作するのであれば、OS ごとに切り替える必要はありませんね。

> Call Shell(App.Path & "\setup.exe")と
> Call Shell(App.Path & "setup.exe")を
そもそも、この書き方が問題かと。

たとえば前者の記述では、App.Path が「D:\」を返した場合において、
「D:\\setup.exe」のように、"\" が連続したパスになってしまいます。

また、後者は App.Path が「C:\folder」を返した場合において、
「C:\foldersetup.exe」のように、ファイル名がおかしくなってしまいます。

前回の回答にも書きましたが、App.Path の末尾に "\" が来る場合とこない場合が
あるのですから、結合前に App.Path の内容をチェックするか、または、
BuildPath メソッドを使って結合するようにすべきかと思いますよ。

> OSを自動判別して切り替えて使用したいのですが
今回の件で、OS の判別が必要なのかどうかは分りませんが、もしも
必要ということであれば、システム情報コントロール(SysInfo)が使えるかと。


なお  2007-04-18 20:45:47  No: 98586

魔界の仮面弁士様の書き込まれた意味がようやく理解出来ました。
又、自分の説明不足があった事がよくわかりました。申し訳ありません。

CDのルートに、
   autorun.inf
   setup.exe
   CD.exe
があり、autorunでCD.exeを実行し、
CD.exeのCommand1をクリックすると、setup.exeが起動する、といった内容でした。

結局、
Call Shell(App.Path & "setup.exe")
で全てのOSで正常に動作確認できました。
魔界の仮面弁士様のご指摘の通りでした、本当にありがとうございました。

疑問が残ったことは、

> たとえば前者の記述では、App.Path が「D:\」を返した場合において、
> 「D:\\setup.exe」のように、"\" が連続したパスになってしまいます。

これが、WindowsXP/2000では
Call Shell(App.Path & "\setup.exe")
でなぜか正常に動作してしまうのです・・・

これには納得がいきませんが、ひとまず解決済みにします。

また質問に現れると思いますが、皆様よろしくお願い致します。


魔界の仮面弁士  2007-04-18 22:20:31  No: 98587

> Call Shell(App.Path & "setup.exe")
> で全てのOSで正常に動作確認できました。
結論的にはそうなのですが、ルート以外のパスに配置されることも考えて、
  If Right(App.Path, 1) <> "\" Then
    path = App.Path & "\setup.exe"
  Else
    path = App.Path & "setup.exe"
  End If
などとしておいた方が安全かな、と。

> Call Shell(App.Path & "\setup.exe")
> でなぜか正常に動作してしまうのです・・・
環境が無いので、こちらでは検証はできませんが、
もしかしたら、OS またはファイルシステムの違いによるものかも。

Command.exe による MS-DOS プロンプトにおいては、
  CD C:\parent\child     … ○  ChDir が成功する。
  CD C:\\parent\child    … ×  ChDir が失敗する。
となりますが、cmd.exe のコマンド プロンプトにおいては、
  CD C:\parent\child     … ○  ChDir が成功する。
  CD C:\\parent\child    … ○  ChDir が成功する。
という結果になりますので、それと似た話なのかな…と。
# 関係ないかも知れませんが。


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

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






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