Ah, ich habe eine Kleinigkeit herausgefunden: Ich öffne die Windowsanwendung mittels FreeHeapAndExec.
Delphi-Quellcode:
Function FreeHeapAndExec( Command :
String;
Params :
String):Word;
Var
lF : Text;
lTimeOut : LongInt;
OldHeapEnd,
NewHeapEnd : Word;
Error : Integer;
lGetError : Boolean;
Begin
Error:=0;
If MemAvail<$1000
then
Error:=8;
If Error=0
then Begin
{$IfDef MsDos}
NewHeapEnd:=Seg(HeapPtr^)-PrefixSeg;
OldHeapEnd:=Seg(HeapEnd^)-PrefixSeg;
asm
mov ah,4Ah
mov bx,NewHeapEnd
mov es,PrefixSeg
Int 21h
jnc @EXIT
mov Error,ax
@EXIT:
End;
If Error=0
then Begin
{$EndIf MsDos}
lGetError:=Pos('
DOSERROR ','
' + UpStr(Params) + '
') > 0;
if lGetError
then
EraseFile(ExtractFileDir(Command) + '
DosError.Dat');
if Pos('
CONGDI',UpStr(Params)) > 0
then
Message('
vor');
SwapVectors;
Exec(Command,Params);
SwapVectors;
if Pos('
CONGDI',UpStr(Params)) > 0
then
Message('
nach');
if lGetError
and (DosError = 0)
then
begin
lTimeOut:=Ticks + 86
{5 Sekunden};
while not FileExists(ExtractFileDir(Command) + '
DosError.Dat')
and (Ticks < lTimeOut)
do
Delay(1000);
Assign(lF,ExtractFileDir(Command) + '
DosError.Dat');
Reset(lF);
If IoResult = 0
then
begin
ReadLn(lF,Error);
if IoResult = 0
then ;
end;
Close(lF);
if IoResult = 0
then ;
end;
{$IfDef MsDos}
asm
mov ah,4Ah
mov bx,OldHeapEnd
mov es,PrefixSeg
Int 21h
jnc @EXIT
mov Error,ax
@EXIT:
End;
End;
{$Else MsDos}
if Error = 0
then
Error := DosError;
{$EndIf MsDos}
End;
FreeHeapAndExec:=Error;
End;
Es klappt bei leerem Heapspeicher, später nicht mehr. Dann wird der Fehler in meiner Anwendung liegen.