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