AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DynArr: Dll <-> Programm

Ein Thema von StanY · begonnen am 12. Dez 2004 · letzter Beitrag vom 25. Dez 2004
Antwort Antwort
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#1

DynArr: Dll <-> Programm

  Alt 12. Dez 2004, 12:48
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:
...
type
  TBotType = record
    Cmd: PChar;
    Msg: Array of PChar;
  end;

  TDllType = record
    Cmd: Array of PChar;
    Status: Integer;
  end;
...
Dll-Code
Delphi-Quellcode:
function DllNotify(DllType: TDllType): TBotType;
begin
  Result.Cmd := 'PONG';
  SetLength(Result.Msg,1);
  Result.Msg[0] := 'DSADGFASDJKE';
end;
Hautprogramm
Delphi-Quellcode:
    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
Ich denke, es liegt daran, dass man entweder gar keine dynamischen Arrays so übergeben kann (wenn ja, wie kann cih es sonst realisieren).

edit: Das Komische ist, dass WriteLn(BotType.Msg[0]); noch korrekt ausgegeben wird und dann der Fehler kommt (invalid Pointer).
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#2

Re: DynArr: Dll <-> Programm

  Alt 13. Dez 2004, 19:22
Weiß keiner Rat? Es hält mein Projekt extrem auf und ich weiß keine andere gute Lösung...
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#3

Re: DynArr: Dll <-> Programm

  Alt 19. Dez 2004, 00:04
Keiner? Nichtmal 'ne andere Lösungsmöglichkeit?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: DynArr: Dll <-> Programm

  Alt 19. Dez 2004, 11:13
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.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#5

Re: DynArr: Dll <-> Programm

  Alt 19. Dez 2004, 14:16
Bei Dynamischen Arrays musst du *leider* Borlands Memory-Manager Delphi-Referenz durchsuchenShareMem benutzen, ansonsten kannst du keine Dyn. Arrays/LongStrings übergeben. Ebenso ist es, wenn du ein einem Model(zB der DLL) mit GetMem oder New etc. Speicher holst und diesen Speicher in einem anderen Modul (zB Exe) wieder freigibst.
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#6

Re: DynArr: Dll <-> Programm

  Alt 19. Dez 2004, 16:11
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 \\:
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#7

Re: DynArr: Dll <-> Programm

  Alt 19. Dez 2004, 18:06
Gerne doch.


Delphi-Quellcode:
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;
...
So sollten erstmal die Datentypen aussehen!
Grund: GetMem besort Blockweise speicher!

In der DLL muss es zwei Funktionen geben:
Delphi-Quellcode:
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;
Das wichte bei der Sache ist, Speicher der in einer Dll geholt wird, muss in dieser auch wieder freigegeben werden. Deswegen Create und Destroy.

Ich hoffe das reicht!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#8

Re: DynArr: Dll <-> Programm

  Alt 25. Dez 2004, 11:59
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)
  Mit Zitat antworten Zitat
paresy

Registriert seit: 24. Aug 2004
Ort: Lübeck
105 Beiträge
 
Delphi 2007 Professional
 
#9

Re: DynArr: Dll <-> Programm

  Alt 25. Dez 2004, 13:43
versuch mal dies:

Delphi-Quellcode:
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;
sollte laufen... habs grad mal so eingetippt...

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:
Das wichte bei der Sache ist, Speicher der in einer Dll geholt wird, muss in dieser auch wieder freigegeben werden. Deswegen Create und Destroy.
das wär mir neu.... eigentlich reicht es im hauptprogramm dann wieder :

Delphi-Quellcode:
    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]);
grüße, paresy
  Mit Zitat antworten Zitat
StanY

Registriert seit: 6. Aug 2004
145 Beiträge
 
#10

Re: DynArr: Dll <-> Programm

  Alt 25. Dez 2004, 16:58
Nein. Immernoch derselbe Fehler. \\:
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz