CreateProcessでエラーが出るのですが

解決


XYZ  2011-12-27 17:16:02  No: 41387  IP: 192.*.*.*

過去のトピを参考にプログラムしているのですが、エラー(赤い波線)が出ます。
どうしたらいいのでしょうか?
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;

編集 削除
Nov  2011-12-27 23:49:19  No: 41388  IP: 192.*.*.*

変数名StartUpInfoはWindows構造体と同名なので、変えれば動くと思います。
また、質問とは関係ありませんが、CreateProcessの第2引数は、定数文字列ではCreateProcessWが失敗するとMSDNさんが言ってますので、変数ポインタにしたほうが良いです。

編集 削除
Nov  2011-12-27 23:57:47  No: 41389  IP: 192.*.*.*

ひとつ確認を忘れてました。
もし、質問のソースが省略したものなら良いのですが、STARTUPINFOは、少なくともcbに構造体のサイズ(SizeOf(TStartupInfo))をセットしないと。

編集 削除
XYZ  2011-12-29 16:51:35  No: 41390  IP: 192.*.*.*

Novさん回答ありがとうございます。
第二引数を変数にしたのですが、stringとPAnsiCharには互換性がありませんと出ます。
どうしたら良いんでしょうか?
よろしくお願いします。

編集 削除
Nov  2011-12-29 22:28:20  No: 41391  IP: 192.*.*.*

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;

こんな感じでどうでしょうか。

編集 削除
Nov  2011-12-29 22:47:51  No: 41392  IP: 192.*.*.*

怪しげな間違い?  厳密には、
誤)cmdstr: array[0..MAX_PATH] of char;
正)cmdstr: array[0..MAX_PATH-1] of char;
かも。(厳密ではじめておきながら、かもで締めるあたりが怪しげ)

編集 削除
XYZ  2011-12-30 13:21:38  No: 41393  IP: 192.*.*.*

Novさん、ありがとうございます。

cmdstr: array[0..MAX_PATH] of char;
でうまくいきました。
(もうひとつは試していないんですけど)

編集 削除
XYZ  2011-12-30 14:49:23  No: 41394  IP: 192.*.*.*

チェック忘れてました。

編集 削除