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

解決


パープルアイ  2006-03-16 20:45:31  No: 20512

コンソールアプリケーションから複数のプログラムを
起動しようと思っているのですが、起動できないので、
以下のようなテストプログラムを作成してみたところ、
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-17 01:41:33  No: 20513

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


かみづ  2006-03-17 07:01:48  No: 20514

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


先に良く  2006-03-17 17:42:49  No: 20515

.....

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

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


パープルアイ  2006-03-17 18:33:52  No: 20516

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

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

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


パープルアイ  2006-03-20 19:36:23  No: 20517

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


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

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






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