DOS アプリケーションを呼び出して実行させるには?

解決


かめ  2005-12-15 02:47:31  No: 19240

Delphi2005を使ってエディタを作成しているものです。
DOS アプリケーションを呼び出して結果を取得したいとおもったのでCreateProcessを使って
プログラムを組み立てたのですが、いざ実行してみると「正しくない型キャスト」とエラーが
出てきてしまってコンパイルできずにいます。
CreateProcessについてなど、いろいろ見回ってみたのですがいまいち自分のエラーの原因が
分からなくて躓いております。
以下がプログラム抜粋なのですが…
------------------------------
//DOS表示および実行関係
procedure ExecProcess(Command, Dest: String);
var
SI :TStartupInfo;
PI :TProcessInformation;
begin
  //ウィンドウの属性を初期化
  begin
    SI.cb          := SizeOf(TStartupInfo); //構造体のサイズ指定
    SI.dwX         := 0;                    //ウィンドウの位置指定
    SI.dwY         := 0;
    SI.dwXSize     := 0;                    //ウィンドウのサイズ指定
    SI.dwYSize     := 0;
    SI.wShowWindow := SW_SHOWNORMAL;        //ウィンドウの表示状態指定
    SI.dwFlags     := 0;                    //有効な設定項目を指定 
    SI.lpReserved  := nil;                  //それ以外の項目を初期化
    SI.lpDesktop   := nil;
    SI.lpTitle     := nil;
    SI.cbReserved2 := 0;
    SI.lpReserved2 := nil;                  // DOS プロンプトが表示されるのを抑止する
  end;
  If NOT CreateProcess(nil,PChar(Format('%s %s',[Command,Dest])),nil,nil,False, 0, nil, nil, SI, PI) Then
  //↑エラー発生箇所
  Raise Exception.Create('実行ファイルの設定が正しくありません');
  While WaitForSingleObject(PI.hProcess, 0) = WAIT_TIMEOUT Do
    Application.ProcessMessages;  //プロセス終了まで待機する
    CloseHandle(PI.hProcess);
end;
-------------------------
このままのプログラムだと、//↑エラー発生箇所部分で正しくない型キャストとエラーが出ているのです。
CreateProcessの使い方が間違っているのでしょうか?
こういった掲示板で質問させていただくのは初めてなので、何か説明の不十分なところがあったなら申し訳ありません。
よろしくお願いします。


  2005-12-15 16:58:52  No: 19241

コンソールアプリのリダイレクトをしてくれるコンポがあった気がする
それと合わせてCreateProcessじゃなくてShellExecute使えばいいんじゃないかな?


ん?  2005-12-15 18:04:02  No: 19242

> 正しくない型キャストとエラー
ということは、キャストしている部分
PChar(Format('%s %s',[Command,Dest]))
が、怪しいってことでしょう。
var
  hoge:String;
begin
  〜
  hoge := Format('%s %s',[Command,Dest]);
  CreateProcess(〜, PChar(hoge),〜
  〜
end;
こんな風に変更したら?


かめ  2005-12-16 02:25:58  No: 19243

ありがとうございます。
>コンソールアプリのリダイレクトをしてくれるコンポがあった気がする
>それと合わせてCreateProcessじゃなくてShellExecute使えばいいんじゃないかな?
ということは、このCreateProcessではまったく出来ないでしょうか?
できればCreateProcessで実現したかったのですが…。

>キャストしている部分PChar(Format('%s %s',[Command,Dest]))が、怪しいってことでしょう。
おっしゃっていただいたとおり書き換えてみたのですが、やはり正しくない型キャストとエラーがでてしまいます。
もっと違う部分に問題があるのでしょうか?

検索をかけて調べて回ってはいるのですが、Delphi2005ではなにか変わっているのかやり方が変わっているのか、どうも同じようにやってみてもコンパイルできずにいます。


Mr.XRAY  URL  2005-12-16 06:48:10  No: 19244

かめさんのコードをそのままコピペして,D5,6,7,2005で実行してみました.
私の環境では全くエラーは発生しません.

というのは情報となっていないかも知れませんが,
>Delphi2005ではなにか変わっているのかやり方が変わっているのか、

と書いてありましたので.かめさんの場合,Delphiの他のバージョンだと
エラーが発生しないということですか?


かめ  2005-12-20 23:44:48  No: 19245

ありがとうございます。

>Delphiの他のバージョンだとエラーが発生しないということですか?
私が持っているのは2005for.NETだけなのでそれしか実行できていません。
それでも、なぜかエラーが出てしまうのですが、最初の宣言などに問題があるのでしょうか?


かめ  2005-12-21 02:15:34  No: 19246

何度も失礼します。
私はDelphi2005for.NET VCLフォームアプリケーションで作成しています。
それも何か関係あるでしょうか?


Mr.XRAY  URL  2005-12-21 04:12:06  No: 19247

だいぶ経ったので終わりかと思いましたが...

>それも何か関係あるでしょうか?
関係あります.ですから,質問の時はご自分の環境を記すのが常識となって
いるわけですね..NET のCreateProcessは引数の型はWin32 VCLとは違ってい
ます.CreateProcessの'C'のところにカーソル(キャレット)を移動して,表示
される引数を確認して下さい.


かめ  2005-12-21 04:36:45  No: 19248

ありがとうございます。
質問の仕方も大変悪かったようで、反省しています。
ご丁寧にありがとうございました。


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

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






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