Shellが、パスによっては動作しない


FATBOY  2005-05-17 15:55:20  No: 89871  IP: [192.*.*.*]

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でも、確実に動作させる方法があれば、御教示ください。
また、起動しない理由も教えていただければ幸いです。

編集 削除
ガッ  2005-05-17 16:20:12  No: 89872  IP: [192.*.*.*]

(´Д`;)<久々に登場しますた。
・とりあえず、「正しく動作しない」というのはどういうことなのかと小一時間問い詰め(ry
・あと、パスをダブルクオートで括ったコードがちょと気になるので、
  コードを載せていただけると嬉しいです。

で、
> shell( "CC:\Documents and Settings\ZZZ\デスクトップ\PG.exe" ) NG
まぁ、typoでしょうが、実際のコードこコピペして修正すればよかったかもしれません。

> これを複数のPCで試したところ、ちゃんと起動するPCもあり、訳がわからなくなっています。
動作の違いは何?
起動しない場合は、無反応になってしまうとか?

> 起動しない理由も教えていただければ幸いです。
色々ありすぎて(orzです。
もしかしたら起動ディレクトリを変えたことによって、
内部で何かが起こっているかもしれません。

編集 削除
ひろ  2005-05-17 17:16:31  No: 89873  IP: [192.*.*.*]

> If Shell(XXX, 1) < 0 Then
>     MsgBox "起動失敗"
> End If

If Shell(XXX, 1) = 0 Then

の間違いでは?。ヘルプをちゃんと読みましょう。

編集 削除
じゃんぬねっと  URL  2005-05-17 17:26:06  No: 89874  IP: [192.*.*.*]

> shell("C:\Documents and Settings\ZZZ\デスクトップ\PG.exe") NG

半角スペースのせいかな。

Shell("""C:\Documents and Settings\ZZZ\デスクトップ\PG.exe""")

として実験してくださいです。

編集 削除
FATBOY  2005-05-17 18:28:43  No: 89875  IP: [192.*.*.*]

みなさん、色々とありがとうございます。

実際のコードはこんな感じです


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に引き渡す文字列は、かなり長くなってしまいます。  これに、制限があるのでしょうか?


みなさん、宜しくお願いします

編集 削除
3−t  2005-05-17 20:49:23  No: 89876  IP: [192.*.*.*]

>動くPCと、動かないPC
動くとか動かないという表現が気になるんですが。
エラーメッセージは何ですか?

もしかして起動している実行ファイルの問題じゃないですよね。
同じパスにnotepad.exeとかをコピーして試してみたらどうですか?

編集 削除
oku  URL  2005-05-17 21:39:04  No: 89877  IP: [192.*.*.*]

自分は、こうゆう時には下記で言うと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

編集 削除
 2005-05-18 10:41:36  No: 89878  IP: [192.*.*.*]

>実際には、引数もたくさん付けてshellをコールしています。
ということだから、
実行される側のプログラムがCommandで受け取っている引数を確認してみては?
スペース入りファイルパスなんかを正しく処理できていない  という可能性はないですか?

それを呼び出し側のShell関数のせいにしていませんか?

と想像してしまう。

編集 削除
 2005-05-18 10:41:37  No: 89879  IP: [192.*.*.*]

>実際には、引数もたくさん付けてshellをコールしています。
ということだから、
実行される側のプログラムがCommandで受け取っている引数を確認してみては?
スペース入りファイルパスなんかを正しく処理できていない  という可能性はないですか?

それを呼び出し側のShell関数のせいにしていませんか?

と想像してしまう。

編集 削除
FATBOY  2005-05-18 15:13:03  No: 89880  IP: [192.*.*.*]

みなさん、新たな助言、ありがとうございます。
ちょっと、今日、明日はテストができる環境でないので、それ以降にみなさんの助言を試してみます。

編集 削除
papa  2005-05-18 19:41:40  No: 89881  IP: [192.*.*.*]

話が横道にそれますが、
文字列の連結に'+’を使うのが気になります。

例えば変数がバリアント型のとき、加算なのか連結なのかあいまいになります。
'&'を使ったほうがよいのでは

編集 削除
FATBOY  2005-05-20 18:53:47  No: 89882  IP: [192.*.*.*]

wstr変数の中身をバッチファイルに出力して検証してみたところ、どうやら、コマンドラインの文字列数が256文字を超えるとダメな様です。
動作していた方のPCでは、256文字を超えても大丈夫でした。
とりあえず、階層の深いフォルダでは動作させないという方向で、使っていくつもりです。
一応は、解決のフラグを立てておきますが、こういった制限の回避方法があれば、御教示してもらえると嬉しいです

編集 削除
papa  2005-05-21 09:12:47  No: 89883  IP: [192.*.*.*]

GetShortPathName  を使ってパス名を短くするか、
chdir でカレントディレクトリーを変えてパスを指定しなくするってのは

編集 削除
FATBOY  2005-05-27 17:03:58  No: 89884  IP: [192.*.*.*]

papaさん、御教示ありがとうございます
どちらも良さそうですね。
試してみます

編集 削除
クラゲ  URL  2005-06-01 20:56:45  No: 89885  IP: [192.*.*.*]

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

編集 削除