![]() |
DynArr: Dll <-> Programm
Hallo. Mal wieder habe ich ein Problem.
Ich habe ein Programm, welches bislang eine Dll besitzt und mit der recht oft Daten austauscht. Zu diesem Zweck habe ich zwei Records geschrieben. Eines, welches das Haupt-Programm benutzt, um Daten an die Dll zu senden und ein anderes, welche die Dll benutzt etc. Das senden an die Dll scheint wunderbar zu klappen. Allerdings die Rückgabe nicht, sobald das dynamische Array ins Spiel kommt: DllType.pas (Records für Programm und Dll, sind beide eingebunden)
Delphi-Quellcode:
Dll-Code
...
type TBotType = record Cmd: PChar; Msg: Array of PChar; end; TDllType = record Cmd: Array of PChar; Status: Integer; end; ...
Delphi-Quellcode:
Hautprogramm
function DllNotify(DllType: TDllType): TBotType;
begin Result.Cmd := 'PONG'; SetLength(Result.Msg,1); Result.Msg[0] := 'DSADGFASDJKE'; end;
Delphi-Quellcode:
Ich denke, es liegt daran, dass man entweder gar keine dynamischen Arrays so übergeben kann (wenn ja, wie kann cih es sonst realisieren).
BotType := dllFunc[i](DllType); //Hiermit wird DllType an die DllFunction DllNotify gesendet
WriteLn(BotType.Cmd); //Ausgabe von BotType.Cmd (klappt prolemlos) WriteLn(BotType.Msg[0]); //FEHLER edit: Das Komische ist, dass WriteLn(BotType.Msg[0]); noch korrekt ausgegeben wird und dann der Fehler kommt (invalid Pointer). |
Re: DynArr: Dll <-> Programm
Weiß keiner Rat? Es hält mein Projekt extrem auf und ich weiß keine andere gute Lösung...
|
Re: DynArr: Dll <-> Programm
Keiner? Nichtmal 'ne andere Lösungsmöglichkeit?
|
Re: DynArr: Dll <-> Programm
Lass das mit den Dyn. Array, ich weis gerade auch nicht was der Compiler da genau generiert hat.
Mach deine Array's lieber sauber mit GetMem und FreeMem. |
Re: DynArr: Dll <-> Programm
Bei Dynamischen Arrays musst du *leider* Borlands Memory-Manager
![]() |
Re: DynArr: Dll <-> Programm
Gibt es keine andere Möglichkeit?
ShareMem benutzte ich ungerne, da ich dann - soweit ich weiß - bei dem Programm eine Dll mit ausliefern muss und die dlls nur delphikompatibel sind. Kann mir jemand das mit GetMem und FreeMem erklären? Ich werde da leider nicht ganz schlau draus \\: |
Re: DynArr: Dll <-> Programm
Gerne doch.
Delphi-Quellcode:
So sollten erstmal die Datentypen aussehen!
type
TBotType = record Cmd: PChar; iLen : Integer; // Anzahl der Msg's Msg: array [0..0] of PChar; end; TDllType = record Status: Integer; iLen : Integer; // Anzahl der Cmd's Cmd: array [0..0] of PChar; end; ... Grund: GetMem besort Blockweise speicher! In der DLL muss es zwei Funktionen geben:
Delphi-Quellcode:
Das wichte bei der Sache ist, Speicher der in einer Dll geholt wird, muss in dieser auch wieder freigegeben werden. Deswegen Create und Destroy.
function CreateBotType(Cmd : PChar; Msg : array of PChar) : PBotType;
begin Größe Berechnen GetMem Größe rufen Daten hineinkopieren end procedure DestroyObject(p : Pointer); begin FreeMem(p); end; Ich hoffe das reicht! |
Re: DynArr: Dll <-> Programm
Er,.. leider nicht.
Also. Mit GetMem reserviere ich ja Speicher. Mit FreeMem gebe ich ihn wieder frei. Nur verstehe ich nicht ganz, was mir das bringt, wie ich also damit doch meine DynArr übergeben kann. In der Prozedur wo ich die Sachen an den Bot übergebe, muss ich ja den Speicher reservieren. Aber wie lese ich ihn in der DLL wieder aus? ôO (sry) |
Re: DynArr: Dll <-> Programm
versuch mal dies:
Delphi-Quellcode:
sollte laufen... habs grad mal so eingetippt...
function DllNotify(DllType: TDllType): TBotType;
begin Result.Cmd := AllocMem(Length('PONG')+1); StrPCopy(Result.Cmd, 'PONG'); SetLength(Result.Msg,1); Result.Msg[0] := AllocMem(Length('DSADGFASDJKE')+1); StrPCopy(Result.Msg[0], 'DSADGFASDJKE'); end; das problem ist wahrscheinlich, dass delphi den speicher von den 2 strings am ende der procedur automatisch wieder freigibt... weil es ja nicht weiß dass du es weiterverwendest... Zitat:
Delphi-Quellcode:
grüße, paresy
BotType := dllFunc[i](DllType); //Hiermit wird DllType an die DllFunction DllNotify gesendet
WriteLn(BotType.Cmd); //Ausgabe von BotType.Cmd (klappt prolemlos) WriteLn(BotType.Msg[0]); //FEHLER FreeMem(BotType.Cmd); FreeMem(BotType.Msg[0]); |
Re: DynArr: Dll <-> Programm
Nein. Immernoch derselbe Fehler. \\:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz