コンソールアプリケーションから複数のプログラムを
起動しようと思っているのですが、起動できないので、
以下のようなテストプログラムを作成してみたところ、
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.
スレッド処理は勉強中なんですが,
Excute内にてCreateメソッドの使用は有りなのかとふと疑問に・・・
Create(false)でExcute内の分が実行されるから無限ループ?
考え方が間違ってたらスイマセン。
別にExecute内でCreateしているわけではないと思います。
問題はスレッド生成した後、次のend.にすぐ到達してプログラムが終了してしまうところではないかと。
.....
procedure TSSGetThread.Execute;
begin
ProgramExecute;
Terminate;
end;
begin
with TSSGetThread.Create(False) do
while not Terminated do Application.ProcessMessages;
end.
>問題はスレッド生成した後、次のend.にすぐ到達してプログラムが終了
確認できました。
CreateProcess実行後に WriteLnで出力しようとした文字列が
表示されなかったので、てっきり CreateProcess に問題が
あると思い、そのことに気がつきませんでした。
どうもありがとうございます。
すみません、
解決しました。
ツイート | ![]() |