過去のトピを参考にプログラムしているのですが、エラー(赤い波線)が出ます。
どうしたらいいのでしょうか?
Delphi2005を使っています。
プログラム
procedure TForm1.disp_file
var
filename:string;
ret: Boolean;
StartupInfo: TStartupInfo; @@ここに赤い波線が出ます。エラー内容は「型識別子が必要です」と出ます。
ProcessInfo: TProcessInformation;
begin
filename:='filename.txt';
ret := CreateProcess(
nil,
'C:\sample.exe '+filename,
nil,
nil,
False,
CREATE_DEFAULT_ERROR_MODE,
nil,
nil,
StartupInfo,
ProcessInfo
);
end;
変数名StartUpInfoはWindows構造体と同名なので、変えれば動くと思います。
また、質問とは関係ありませんが、CreateProcessの第2引数は、定数文字列ではCreateProcessWが失敗するとMSDNさんが言ってますので、変数ポインタにしたほうが良いです。
ひとつ確認を忘れてました。
もし、質問のソースが省略したものなら良いのですが、STARTUPINFOは、少なくともcbに構造体のサイズ(SizeOf(TStartupInfo))をセットしないと。
Novさん回答ありがとうございます。
第二引数を変数にしたのですが、stringとPAnsiCharには互換性がありませんと出ます。
どうしたら良いんでしょうか?
よろしくお願いします。
PAnsiCharとStringをそのままくっつけようとしてないでしょうか。
文字列を扱うときは、一方の型に変換します。
方法は色々ありますが、例として、元のソースに追加・変更をしました。
procedure TForm1.disp_file
var
filename:string;
ret: Boolean;
SI: TStartupInfo; // 名前を変更
ProcessInfo: TProcessInformation;
cmdstr: array[0..MAX_PATH] of char; // 変数追加
begin
filename:='filename.txt';
StrPCopy(cmdstr, 'C:\sample.exe '+filename); // ここでコピー
ZeroMemory(@SI, SizeOf(SI)); // 構造体のクリア
SI.cb := SizeOf(SI); // 構造体サイズのセット
ret := CreateProcess(
nil,
cmdstr, // 問題の個所
nil,
nil,
False,
CREATE_DEFAULT_ERROR_MODE,
nil,
nil,
SI, // 名前を変更
ProcessInfo
);
// もし、起動したプロセスをハンドリングする必要がなければ、このあとプロセス起動に使用したハンドルを閉じます。
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
こんな感じでどうでしょうか。
怪しげな間違い? 厳密には、
誤)cmdstr: array[0..MAX_PATH] of char;
正)cmdstr: array[0..MAX_PATH-1] of char;
かも。(厳密ではじめておきながら、かもで締めるあたりが怪しげ)
Novさん、ありがとうございます。
cmdstr: array[0..MAX_PATH] of char;
でうまくいきました。
(もうひとつは試していないんですけど)
チェック忘れてました。
ツイート | ![]() |