エラーにならないようにするには?

解決


パープルアイ  2006-03-16 11:45:31  No: 20512  IP: 192.*.*.*

コンソールアプリケーションから複数のプログラムを
起動しようと思っているのですが、起動できないので、
以下のようなテストプログラムを作成してみたところ、
CreateProcessでエラーが発生しているようです。
エラーの内容は「メモリ  ロケーションへのアクセスが無効です。」
となります。
もちろん
  TSSGetThread.Create(false); の代わりに ProgramExecute; を
使用すると正常に動作します。

program Test;

{$APPTYPE CONSOLE}

uses
  Windows,
  Classes,
  Forms,
  SysUtils;

type
  TSSGetThread = class(TThread)
  private
  protected
    procedure Execute; override;
  public
  end;

function ProgramExecute: bool;
var
  SI:         TStartupInfo;
  PI:         TProcessInformation;
  WinDir:     array [0..255] of Char;
  CmdFile:    String;
  CmdLine:    String;
  ErrorCode:  Integer;
  Buff:       array[0..255] of Char;
begin
  GetWindowsDirectory(WinDir, SizeOf(WinDir));
  FillChar(SI, SizeOf(SI), #0);
  SI.cb := SizeOf(SI);
  SI.dwFlags      := STARTF_USESIZE or STARTF_USEPOSITION;
  SI.wShowWindow  := SW_SHOW;

  CmdFile := StrPas(WinDir) + '\NOTEPAD.EXE';
  CmdLine := CmdFile + ' README.TXT';

  Result := CreateProcess(PChar(CmdFile), PChar(CmdLine), nil, nil, False, 0, nil, WinDir, SI, PI);
  if not Result then begin
    ErrorCode := GetLastError;
    writeln('CreateProcess End (' + IntToStr(ErrorCode) + ')');
    FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ErrorCode, LANG_SYSTEM_DEFAULT, Buff, 255, nil);
    WriteLn( Buff );
  end
end;

procedure TSSGetThread.Execute;
begin
  ProgramExecute;
end;

begin
  { TODO -oUser -cConsole Main : この下にコードを記述してください }
  TSSGetThread.Create(false);
//  ProgramExecute;
end.

編集 削除
Ru  2006-03-16 16:41:33  No: 20513  IP: 192.*.*.*

スレッド処理は勉強中なんですが,
Excute内にてCreateメソッドの使用は有りなのかとふと疑問に・・・
Create(false)でExcute内の分が実行されるから無限ループ?
考え方が間違ってたらスイマセン。

編集 削除
かみづ  2006-03-16 22:01:48  No: 20514  IP: 192.*.*.*

別にExecute内でCreateしているわけではないと思います。
問題はスレッド生成した後、次のend.にすぐ到達してプログラムが終了してしまうところではないかと。

編集 削除
先に良く  2006-03-17 08:42:49  No: 20515  IP: 192.*.*.*

.....

procedure TSSGetThread.Execute;
begin
  ProgramExecute;
  Terminate;
end;

begin
  with TSSGetThread.Create(False) do
    while not Terminated do Application.ProcessMessages;
end.

編集 削除
パープルアイ  2006-03-17 09:33:52  No: 20516  IP: 192.*.*.*

>問題はスレッド生成した後、次のend.にすぐ到達してプログラムが終了
確認できました。

CreateProcess実行後に WriteLnで出力しようとした文字列が
表示されなかったので、てっきり CreateProcess に問題が
あると思い、そのことに気がつきませんでした。

どうもありがとうございます。

編集 削除
パープルアイ  2006-03-20 10:36:23  No: 20517  IP: 192.*.*.*

すみません、
解決しました。

編集 削除