AW: Avanti-cl mit Delphi - ???

Harald Schmid Harald.Schmid at t-online.de
Mi Mai 29 14:52:21 CEST 2002


Liebe Frau Koczian, lieber Herr Hoppner,

leider bin ich im Moment so sehr eingespannt, da? ich auch nicht im
geringsten dazu komme, avanti-cl mehr zu testen. Meine bisherigen
Erfahrungen sind nur so, da? ich einen eigenen Avanti-cl mit
TCP/IP-Funktionalitat am Laufen habe, allerdings nach ca. 88.000 Jobs mein
Arbeitsspeicher (512 MB) vollig aufgebraucht war. Nun kam ich bisher also
noch nicht dazu zu testen, ob das an avanti-cl oder an meinem TCP/IP-Gerust
lag - aber wenn Sie, Herr Hoppner, noch vor Sie uns "verlassen" ein
Stundchen Zeit hatten, das zu uberprufen, ware ich - so ich denn wieder dazu
komme - mit avanti-cl (fast) vollstandig glucklich.

Doch nun zu Ihnen, Frau Koczian:
Anbei eine selbstgestrickte Funktion, um mit avanti-cl in Delphi Jobs
abarbeiten zu konnen. Dabei ist noch eine Menge unaufgeraumtes Zeug dabei,
aber wie oben geschrieben, ich komme im Moment nicht dazu, mich mehr damit
zu beschaftigen.

Viele Gru?e

Harald Schmid

***            Harald Schmid              ***
      EDV-Beratung und Programmierung
Bahnhofstr. 23, D-82347 Bernried, Deutschland

  Telefon  +49 (0)8158 / 90 34 99
  Fax      +49 (0)8158 / 90 35 99
  Mobil    +49 (0)179  / 52 82 414
  eMail    mailto:harald.schmid at t-online.de


mJob ist der Avanti-Job, mAvantiExe der Avanti-cl-Dateiname inklusive
vollstandigem Pfad. Nun mussen mit dem normalen Avanti noch die
entsprechenden Registereintrage eingestellt werden...

function DoAvantiJob(mJob, mAvantiExe : string) : string;
var
	lAvantiPath : string;
	lJobBuffer: array[0..AvantiJobBufferSize] of char;
	lResultBuffer : array[0..AvantiResultBufferSize] of char;
	bSuccess : boolean;
	lNumWritten : Cardinal;
	lNumRead: Cardinal;
	StartUp: TStartupInfo;
	Process: TProcessInformation;
	SecAtt : TSecurityAttributes;
	IHandle1, OHandle1 : THandle;
	IHandle2, OHandle2 : THandle;
	IHandle3, OHandle3 : THandle;
begin
	Result := '';
	fillchar(lJobBuffer, sizeof(lJobBuffer), #0);
	strpcopy(lJobBuffer, mJob + #26);
	lAvantiPath := hsAddSlash(extractfilepath(mAvantiExe));

	try
		fillchar(secatt, sizeof(secatt), #0);
		secatt.nLength := sizeof(secatt);
		secatt.bInheritHandle := true;
		secatt.lpSecurityDescriptor := nil;

		bSuccess := CreatePipe(IHandle1, OHandle1, @secatt,
AvantiOutputBufferSize);
		if not bSuccess then raise EAvantiCLError.Create('Pipe1 konnte nicht
erstellt werden!');
		bSuccess := CreatePipe(IHandle2, OHandle2, @secatt,
AvantiInputBufferSize);
		if not bSuccess then raise EAvantiCLError.Create('Pipe2 konnte nicht
erstellt werden!');
		bSuccess := CreatePipe(IHandle3, OHandle3, @secatt,
AvantiInputBufferSize);
		if not bSuccess then raise EAvantiCLError.Create('Pipe3 konnte nicht
erstellt werden!');

		fillchar(StartUp, sizeof(StartUp), #0);
		with StartUp do begin
			cb := sizeof(StartUp);
			dwFlags:= STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
			wShowWindow:= SW_HIDE;
			hStdOutput := OHandle1;
			hStdInput:= IHandle2;
			// mu? eventuell auch noch angepasst werden
			hStdError:= OHandle3;
		end;

	//		StartUp.hStdInput:= CreateFile('c:\programme\avanti-w\job2.txt',
	//			GENERIC_READ, FILE_SHARE_READ, @secatt,
	//			OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

		bSuccess := CreateProcess(nil, PChar(mAvantiExe), @secatt, @secatt, True,
			CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
			nil, pchar(lAvantiPath), startup, process);

		if not bSuccess then raise EAvantiCLError.Create('Prozess konnte nicht
erstellt werden!');

		WriteFile(OHandle2, lJobBuffer, strlen(lJobBuffer), lNumWritten, nil);
		repeat
			FillChar(lResultBuffer, AvantiResultBufferSize + 1, #0);
			bSuccess := ReadFile(IHandle1, lResultBuffer, AvantiResultBufferSize,
lNumRead, nil);
			if bSuccess then
				Result := Result + lResultBuffer;
//			Application.ProcessMessages;
		until copy(Result, length(Result) - length(AvantiEor) + 1,
length(AvantiEor)) = AvantiEor;
//		FillChar(lResultBuffer, AvantiResultBufferSize + 1, #0);
//		bSuccess := ReadFile(IHandle3, lResultBuffer, AvantiResultBufferSize,
lNumRead, nil);
//		CodeSite.SendString('log',lResultBuffer);
//		CodeSite.SendMemoryAsHex('mem', @lResultBuffer, strlen(lResultBuffer));
		delete(Result, length(Result) - length(AvantiEor) + 1, length(AvantiEor));
	finally
		if process.hProcess <> 0 then CloseHandle(process.hProcess);
		if process.hThread <> 0 then CloseHandle(process.hThread);
		if IHandle1 <> 0 then CloseHandle(IHandle1);
		if OHandle1 <> 0 then CloseHandle(OHandle1);
		if IHandle2 <> 0 then CloseHandle(IHandle2);
		if OHandle2 <> 0 then CloseHandle(OHandle2);
	end;
end;





Mehr Informationen über die Mailingliste Allegro