スペースの入ったパス名を渡すには?

解決


komin  2006-11-09 23:26:54  No: 23838

Delphiで作ったプログラムから他のプログラムを、データファイルのファイル名を引数にして起動しています。

  bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'),
                    Pchar(TmpDir + Directoryname + StringGrid1.Cells[1,Arow] + StringGrid1.Cells[2,Arow] + '.jdt'),
                    nil,
                    nil,
                    False,
                    CREATE_DEFAULT_ERROR_MODE,
                    nil,
                    nil,
                    SI,
                    PI);

  この時に、CreateProcessの第一引数はスペースの入ったパス名が渡されて目的のアプリケーションが起動できるのですが、そのアプリケーションに読み込ませるファイル名を上記のように第二引数で渡すと、パスの中のスペースが入った部分で切れてしまって、ファイルが見つからないという結果になります。たとえば第二引数に「D:\Delphi Project\filename」とすると、起動されたアプリケーションで「ファイルが見つかりません」というエラーが発生します。そこで、起動される側のプログラムのOnShowで第二引数をShowmessageさせてみると、スペースが入った前の部分、この例で言えば「D:\Delphi」までしか渡っていません。Pcharにキャストする時の問題化と思ったのですが、第一引数では問題はありませんので、何か他に問題があると思います。おわかりになる方がいらっしゃればご教示ください。


deldel  2006-11-10 01:10:53  No: 23839

""でくくるといいと思います。


komin  2006-11-10 18:10:51  No: 23840

> ""でくくるといいと思います。

 最初のコードを下記のように変更しました。

prmStr := '"' + TmpDir + Directoryname + StringGrid1.Cells[1,Arow] + StringGrid1.Cells[2,Arow] + '.jdt' + '"'
中略
  bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'),
                    Pchar(prmStr);

こうしたところ、起動される側に渡される第二引数はヌルになってしまいました。pmStrは正しく「"D:\Delphi Project\filename"」になっているのですが、第二引数でPcharにキャストする時になぜかこうなってしまうようです。


えーとね  2006-11-10 20:01:39  No: 23841

GetShortPathName を使うという方法もあります。

var
  LPath: string;
  SPath : array [0..255] of char;
begin
  GetShortPathName(PChar(LPath), SPath , SizeOf(SPath));
  bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'), PChar(SPath),


deldel  2006-11-10 20:07:30  No: 23842

ShellExecute ではできましたね・・・

  prmStr := '"A B"';
  ShellExecute(Handle, nil, PChar('C:\Project1.exe'), PChar(prmStr), nil, SW_SHOW);


komin  2006-11-10 23:28:36  No: 23843

えーとねさん、deldelさんありがとうございます。

えーとねさんの方法は、
bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'), PChar(SPath), 
ではエラーになりますので
bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'), SPath), 
でコンパイルが通りましたが、第二引数はうまく渡されませんでした。

deldelさんの方法はうまく起動できますが、起動したアプリケーションの終了を待つと言う点で不都合なのです。

しかし、第一引数はスペースが入っていても大丈夫で、第二引数はだめというのが不思議です。こういう仕様なのかバグなのか…


deldel  2006-11-10 23:48:23  No: 23844

なんなんでしょうねぇ・・・
最悪、
  iniファイルなどにパスを書き、起動されたほうでそれを読み込む
  アトムでパスを送信する
っていう方法などがありますけど、これもどうかと・・・。


えーとね  2006-11-10 23:52:14  No: 23845

> 第二引数はうまく渡されませんでした。
第一引数で指定したEXEは、第二引数にも書いた方が良いらしいです。


えーとね  2006-11-10 23:56:45  No: 23846

""でくくる場合の話です。


名前なし  2006-11-11 01:39:33  No: 23847

第一引数は nil。
第二引数は、'(アプリのフルパス)(スペース)(コマンドライン)'。


komin  2006-11-11 01:59:32  No: 23848

第二引数で両方渡す例は検索でも見付けました。その手でやってみます。
それよりももっと基本的な部分で仕様を変更されてしまったので、本体全部見直さなければいけなくなっちゃったので泣き怒りモードです。(ちゃんと基本仕様を決めてから指示してほしいのよね)

みなさん、ありがとうございます。仕様変更も含めて来週の仕事にします。


komin  2006-11-13 18:37:17  No: 23849

> 第一引数は nil。
> 第二引数は、'(アプリのフルパス)(スペース)(コマンドライン)'。

  この方法で解決しました。Win32APIでは、第一引数に起動するアプリケーション名を、大に引数にコマンドラインを渡すように読み取れたので、この通りにシたらだめでしたが、これはDelphiの仕様でしょうか?  それとも私の読み方が違うのでしょうか?
  とりあえず解決としておきます。ありがとうございました。


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

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






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