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にキャストする時の問題化と思ったのですが、第一引数では問題はありませんので、何か他に問題があると思います。おわかりになる方がいらっしゃればご教示ください。
""でくくるといいと思います。
> ""でくくるといいと思います。
最初のコードを下記のように変更しました。
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にキャストする時になぜかこうなってしまうようです。
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),
ShellExecute ではできましたね・・・
prmStr := '"A B"';
ShellExecute(Handle, nil, PChar('C:\Project1.exe'), PChar(prmStr), nil, SW_SHOW);
えーとねさん、deldelさんありがとうございます。
えーとねさんの方法は、
bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'), PChar(SPath),
ではエラーになりますので
bo := CreateProcess(PChar('C:\Program Files\Wcalc\Wcalc.exe'), SPath),
でコンパイルが通りましたが、第二引数はうまく渡されませんでした。
deldelさんの方法はうまく起動できますが、起動したアプリケーションの終了を待つと言う点で不都合なのです。
しかし、第一引数はスペースが入っていても大丈夫で、第二引数はだめというのが不思議です。こういう仕様なのかバグなのか…
なんなんでしょうねぇ・・・
最悪、
iniファイルなどにパスを書き、起動されたほうでそれを読み込む
アトムでパスを送信する
っていう方法などがありますけど、これもどうかと・・・。
> 第二引数はうまく渡されませんでした。
第一引数で指定したEXEは、第二引数にも書いた方が良いらしいです。
""でくくる場合の話です。
第一引数は nil。
第二引数は、'(アプリのフルパス)(スペース)(コマンドライン)'。
第二引数で両方渡す例は検索でも見付けました。その手でやってみます。
それよりももっと基本的な部分で仕様を変更されてしまったので、本体全部見直さなければいけなくなっちゃったので泣き怒りモードです。(ちゃんと基本仕様を決めてから指示してほしいのよね)
みなさん、ありがとうございます。仕様変更も含めて来週の仕事にします。
> 第一引数は nil。
> 第二引数は、'(アプリのフルパス)(スペース)(コマンドライン)'。
この方法で解決しました。Win32APIでは、第一引数に起動するアプリケーション名を、大に引数にコマンドラインを渡すように読み取れたので、この通りにシたらだめでしたが、これはDelphiの仕様でしょうか? それとも私の読み方が違うのでしょうか?
とりあえず解決としておきます。ありがとうございました。
ツイート | ![]() |