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

解決


XYZ  2011-12-28 02:16:02  No: 41387

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

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


Nov  2011-12-28 08:57:47  No: 41389

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


XYZ  2011-12-30 01:51:35  No: 41390

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


Nov  2011-12-30 07:28:20  No: 41391

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-30 07:47:51  No: 41392

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


XYZ  2011-12-30 22:21:38  No: 41393

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

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


XYZ  2011-12-30 23:49:23  No: 41394

チェック忘れてました。


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

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






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