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
当方の知識不足なだけかと思いますが
ご指摘をお願いします。
追記:VBのバージョンは6.0です。
2点確認です。
(1)
その「setup.exe」は、Shell関数からではなく、直接エクスプローラから実行した場合、
Win98SEでも動作するんでしょうか?
#直接実行しても、動作しないなら、VBの問題じゃないですよね。
また、その「setup.exe」は何で作成されたファイルなんでしょうか?
VB6?VC++?セットアップ作成ツール?
(2)
App.Pathに空白が含まれていませんか?
もし含まれているなら、(Program Files等)
> Call Shell("""" & App.Path & "\setup.exe""")
とすると、どうなります?
大吉末吉様、ご回答有り難うございます。
(1)
直接エクスプローラからSetup.exeをダブルクリックした際は正常に起動します。
Setup.exeはInstallShieldです。
(2)
App.Pathに空白は含まれていませんが
"_"(アンダーバー)が含まれています。問題ありますでしょうか?
よろしくお願い致します。
カレントドライブ・カレントディレクトリについても確認してみるとか。
魔界の仮面弁士様、ご回答有り難うございます。
調べているうちに原因がわかりましたが、解決策が見つかりません。
原因はCDから実行していますが、HDDにコピーして実行ファイルの
読み取り専用を外して実行すると正常に動作しました。
実行ファイルが読み取り専用になっているのが原因のようです。
しかし、CDに書き込んだ時点で読み取り専用になってしまうため、
この問題の解決策が見つからない状態です。
読み取り専用になっても正常に動作出来る術はあるのでしょうか?
もう少し調査が必要かも。
1. HDD にコピーして、ファイルを読取専用にしてみた場合はどうなるか。
2. HDD にコピーして、フォルダを読取専用にしてみた場合はどうなるか。
3. CD 実行で、カレントディレクトリを CD 上にしてみた場合はどうなるか。
4. CD 実行で、カレントディレクトリを HDD 上にしてみた場合はどうなるか。
もう一点。
> Call Shell(App.Path & "\setup.exe")
exe がルートディレクトリ上にある場合、App.Path は、
"C:\" のように最後に "\" が含まれるのですが、exe が
下位のディレクトリ上にある時には、最後に "\" が
付加されないという点にも注意してみてください。
案外
Call Shell(App.Path & "\setup.exe")
→
Call Shell(chr(34) & App.Path & "\setup.exe" & chr(34))
で動くようになったりしないですかね?
まぁ、最初に確認してるとは思うけれど
皆様からのアドバイスを頂き、
いろいろ試しているうちに頭がウニのようになり、
テストした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を自動判別して切り替えて使用したいのですが
何か良い方法はありますでしょうか?
> 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)が使えるかと。
魔界の仮面弁士様の書き込まれた意味がようやく理解出来ました。
又、自分の説明不足があった事がよくわかりました。申し訳ありません。
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")
でなぜか正常に動作してしまうのです・・・
これには納得がいきませんが、ひとまず解決済みにします。
また質問に現れると思いますが、皆様よろしくお願い致します。
> 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 が成功する。
という結果になりますので、それと似た話なのかな…と。
# 関係ないかも知れませんが。
ツイート | ![]() |