Hallo nochmal!
Ich überarbeite gerade ein Programm komplett. Und wollte die Variante mit der
DLL benutzen, da dieser Teil oft in Updates drinstecken wird und da macht sich das mit DLLs einfach praktischer.
Dieses Mal ist es wie im Beispiel, ein RichEdit in den Text eingefügt werden soll. Aber der Text steht nicht in einem String, sondern in einem Stream.
Es wird also das RichEdit und der Stream übergeben (und das Hauptformular, weil geprüft wird, ob es sichtbar ist). Die
DLL soll den String aus dem Stream lesen und ihn in das RichEdit einfügen, ans Formatieren denke ich momentan noch nicht.
Das Problem liegt jetzt darin, dass er nach der 1. zeile einfach aufhört die Anweisungen der Procedure abzuarbeiten:
Delphi-Quellcode:
(***************Ausschnitt aus der DLL***************)
procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream);
export;
stdcall;
procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream);
var
I: Integer;
I64: Int64;
Kennung: Char;
S:
String;
begin
St.Seek(0, soFromBeginning);
//<- Die Zeile macht er immer ohne Probleme
St.ReadBuffer(Kennung, 1);
//<- Diese Zeile macht er nicht mehr, aber er zeigt keinen Fehler an!
if Kennung = '
T'
then begin
St.ReadBuffer(I, SizeOf(I));
St.ReadBuffer(S[1], I);
RE.Lines.Add(S);
Melden(MainForm);
end else if Kennung = '
C'
then begin
St.ReadBuffer(I, SizeOf(I));
{ ... }
end else if Kennung = '
B'
then begin
St.ReadBuffer(I64, SizeOf(I64));
{ ... }
end;
end;
//Und so wird alles aufgerufen:
(***************Ausschnitt aus dem programm***************)
TGetMsg =
procedure(RE: TRichEdit; MainForm: TForm; St: TStream);
procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream);
stdcall;
procedure GetMsg(RE: TRichEdit; MainForm: TForm; St: TStream);
var
GM: TGetMsg;
H: Cardinal;
begin
if not FileExists(Main.Pfad+'
DLL_Messaging.dll')
then begin
Beep;
Exit;
end;
H := LoadLibrary(PChar(Main.Pfad+'
DLL_Messaging.dll'));
if H <> 0
then begin
@GM := GetProcAddress(H, '
GetMsg');
if @GM <>
NIL then begin
GM(RE, MainForm, St);
end;
FreeLibrary(H);
end;
end;
procedure TMain.ServerExecute(AThread: TIdPeerThread);
var
I: integer;
St: TStream;
begin
I := AThread.Connection.ReadInteger;
if I > 0
then begin
St := TMemoryStream.Create;
try
AThread.Connection.ReadStream(St, I);
GetMsg(Main.RE, Main, St);
finally
St.Free;
end;
end;
end;
IMHO ist das wieder so ein Problem, wo man alles machen kann was man will, aber es nicht zum laufen bekommt, den ganzen Quelltext in ein neues Projekt kopieren... Würde nicht funktionieren. Nur wenn man sich eine Stunde hinsetzen würde und alles nochmal abtippen würde, dann würde wahrscheinlich alles gehn!
Bitte helft mir, ich bin ratlos!