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の使い方が間違っているのでしょうか?
こういった掲示板で質問させていただくのは初めてなので、何か説明の不十分なところがあったなら申し訳ありません。
よろしくお願いします。
コンソールアプリのリダイレクトをしてくれるコンポがあった気がする
それと合わせてCreateProcessじゃなくてShellExecute使えばいいんじゃないかな?
> 正しくない型キャストとエラー
ということは、キャストしている部分
PChar(Format('%s %s',[Command,Dest]))
が、怪しいってことでしょう。
var
hoge:String;
begin
〜
hoge := Format('%s %s',[Command,Dest]);
CreateProcess(〜, PChar(hoge),〜
〜
end;
こんな風に変更したら?
ありがとうございます。
>コンソールアプリのリダイレクトをしてくれるコンポがあった気がする
>それと合わせてCreateProcessじゃなくてShellExecute使えばいいんじゃないかな?
ということは、このCreateProcessではまったく出来ないでしょうか?
できればCreateProcessで実現したかったのですが…。
>キャストしている部分PChar(Format('%s %s',[Command,Dest]))が、怪しいってことでしょう。
おっしゃっていただいたとおり書き換えてみたのですが、やはり正しくない型キャストとエラーがでてしまいます。
もっと違う部分に問題があるのでしょうか?
検索をかけて調べて回ってはいるのですが、Delphi2005ではなにか変わっているのかやり方が変わっているのか、どうも同じようにやってみてもコンパイルできずにいます。
かめさんのコードをそのままコピペして,D5,6,7,2005で実行してみました.
私の環境では全くエラーは発生しません.
というのは情報となっていないかも知れませんが,
>Delphi2005ではなにか変わっているのかやり方が変わっているのか、
と書いてありましたので.かめさんの場合,Delphiの他のバージョンだと
エラーが発生しないということですか?
ありがとうございます。
>Delphiの他のバージョンだとエラーが発生しないということですか?
私が持っているのは2005for.NETだけなのでそれしか実行できていません。
それでも、なぜかエラーが出てしまうのですが、最初の宣言などに問題があるのでしょうか?
何度も失礼します。
私はDelphi2005for.NET VCLフォームアプリケーションで作成しています。
それも何か関係あるでしょうか?
だいぶ経ったので終わりかと思いましたが...
>それも何か関係あるでしょうか?
関係あります.ですから,質問の時はご自分の環境を記すのが常識となって
いるわけですね..NET のCreateProcessは引数の型はWin32 VCLとは違ってい
ます.CreateProcessの'C'のところにカーソル(キャレット)を移動して,表示
される引数を確認して下さい.
ありがとうございます。
質問の仕方も大変悪かったようで、反省しています。
ご丁寧にありがとうございました。
ツイート | ![]() |