Shellで、自作の実行ファイルを起動するプログラムなのですが、この実行ファイルの格納場所が、Cドライブの直下だと、正しく動作するのですが、これをデスクトップの配下に移動させると、自作の実行ファイルが起動されません。
例:shell( "C:\AAA\PG.exe" ) OK
shell( "CC:\Documents and Settings\ZZZ\デスクトップ\PG.exe" ) NG
実際には、引数もたくさん付けてshellをコールしています。
当初、思いつきで「\Documents and Settings」の様に、パスにスペースがあるのがダメなのかと思い、パスをダブルコーテーションで囲んでみたのですが、NGでした。
また、下記の様にしてコールしているのですが、特にエラーで返っている様子はありません。
If Shell(XXX, 1) < 0 Then
MsgBox "起動失敗"
End If
厄介なのは、これを複数のPCで試したところ、ちゃんと起動するPCもあり、訳がわからなくなっています。 PCのリソースに依存するのでしょうか?
どのPCでも、確実に動作させる方法があれば、御教示ください。
また、起動しない理由も教えていただければ幸いです。
(´Д`;)<久々に登場しますた。
・とりあえず、「正しく動作しない」というのはどういうことなのかと小一時間問い詰め(ry
・あと、パスをダブルクオートで括ったコードがちょと気になるので、
コードを載せていただけると嬉しいです。
で、
> shell( "CC:\Documents and Settings\ZZZ\デスクトップ\PG.exe" ) NG
まぁ、typoでしょうが、実際のコードこコピペして修正すればよかったかもしれません。
> これを複数のPCで試したところ、ちゃんと起動するPCもあり、訳がわからなくなっています。
動作の違いは何?
起動しない場合は、無反応になってしまうとか?
> 起動しない理由も教えていただければ幸いです。
色々ありすぎて(orzです。
もしかしたら起動ディレクトリを変えたことによって、
内部で何かが起こっているかもしれません。
> If Shell(XXX, 1) < 0 Then
> MsgBox "起動失敗"
> End If
If Shell(XXX, 1) = 0 Then
の間違いでは?。ヘルプをちゃんと読みましょう。
> shell("C:\Documents and Settings\ZZZ\デスクトップ\PG.exe") NG
半角スペースのせいかな。
Shell("""C:\Documents and Settings\ZZZ\デスクトップ\PG.exe""")
として実験してくださいです。
みなさん、色々とありがとうございます。
実際のコードはこんな感じです
wstr = """" + T_TERM_EXE + """ " + LOCAL_IP_ADDR + " /W=""" _
+ Param_host + """" + " /L=""" + logfile + """" _
+ " /K=""" + TERA_EXE + "\KEYBOARD"""
If Shell(wstr, 1) = 0 Then
MsgBox "起動失敗"
End If
「T_TERM_EXE」というのは、起動したいプログラムのパスです(TeraTermを改造したもの)
「logfile」も、「TERA_EXE」 も、「T_TERM_EXE」と同様に、デスクトップの配下です。
動くPCと、動かないPCの相違は、機種とメモリの違い(384B:動く 256B:動かない)ですね。 どちらもWin2000Proです
If Shell(XXX, 1) = 0 Then に修正してみましたが、やはりエラー表示はされません。
動かない状況としては、単にシェルが実行されないだけで、他の操作はできます。
見てのとおり、デスクトップの配下で動作させようとすると、Shellに引き渡す文字列は、かなり長くなってしまいます。 これに、制限があるのでしょうか?
みなさん、宜しくお願いします
>動くPCと、動かないPC
動くとか動かないという表現が気になるんですが。
エラーメッセージは何ですか?
もしかして起動している実行ファイルの問題じゃないですよね。
同じパスにnotepad.exeとかをコピーして試してみたらどうですか?
自分は、こうゆう時には下記で言うとwstr変数を
たとえばC:\TEST.BATとかに書き出して、検証します。
wstr = """" + T_TERM_EXE + """ " + LOCAL_IP_ADDR + " /W=""" _
+ Param_host + """" + " /L=""" + logfile + """" _
+ " /K=""" + TERA_EXE + "\KEYBOARD"""
Dim intFileNo As Integer
intFileNo = FreeFile
Open "C:\TEST.BAT" For Output As #intFileNo
Print #intFileNo, wstr
Close #intFileNo
>実際には、引数もたくさん付けてshellをコールしています。
ということだから、
実行される側のプログラムがCommandで受け取っている引数を確認してみては?
スペース入りファイルパスなんかを正しく処理できていない という可能性はないですか?
それを呼び出し側のShell関数のせいにしていませんか?
と想像してしまう。
>実際には、引数もたくさん付けてshellをコールしています。
ということだから、
実行される側のプログラムがCommandで受け取っている引数を確認してみては?
スペース入りファイルパスなんかを正しく処理できていない という可能性はないですか?
それを呼び出し側のShell関数のせいにしていませんか?
と想像してしまう。
みなさん、新たな助言、ありがとうございます。
ちょっと、今日、明日はテストができる環境でないので、それ以降にみなさんの助言を試してみます。
話が横道にそれますが、
文字列の連結に'+’を使うのが気になります。
例えば変数がバリアント型のとき、加算なのか連結なのかあいまいになります。
'&'を使ったほうがよいのでは
wstr変数の中身をバッチファイルに出力して検証してみたところ、どうやら、コマンドラインの文字列数が256文字を超えるとダメな様です。
動作していた方のPCでは、256文字を超えても大丈夫でした。
とりあえず、階層の深いフォルダでは動作させないという方向で、使っていくつもりです。
一応は、解決のフラグを立てておきますが、こういった制限の回避方法があれば、御教示してもらえると嬉しいです
GetShortPathName を使ってパス名を短くするか、
chdir でカレントディレクトリーを変えてパスを指定しなくするってのは
papaさん、御教示ありがとうございます
どちらも良さそうですね。
試してみます
8.3準拠にすれば動くと思いますよ。
ロングファイルネームを利用せず、
ショートファイルネームを使ってみてください。
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" _
(ByVal lpszLongPath As String, _
ByVal lpszShortPath As String, _
ByVal cchBuffer As Long) As Long
Private Sub Command1_Click()
Dim sLongPathName As String
Dim sShortPathName As String * 256
Dim sExecPathName As String
Dim lRetValue As Long
sLongPathName = "C:\Documents and Settings\Administrator\デスクトップ\新しいフォルダ\xxxxx.exe"
lRetValue = GetShortPathName(sLongPathName, sShortPathName, Len(sShortPathName))
sExecPathName = Left(sShortPathName, lRetValue)
Call Shell(sExecPathName)
End Sub
ツイート | ![]() |