Zitat von
gmc616:
... Eine Speichermanager will/kann/darf ich nicht verwenden, da meine Anwendung mit einer weiteren
DLL arbeitet, die sich mit dem Delphi-Speichermanager nicht verträgt
Wenn du irgendwo mit Delphi-Strings arbeitest benötigst Du aber einen.
Hast Du schon mal probiert ob du mit FastMM arbeiten könntest?
Zitat von
gmc616:
Was passiert eigentlich im Speicher wenn ich der Delphi-
DLL
a) einen String,
b) ein PChar,
c) einen Zeiger auf einen String übergebe ??
zu a, Solange du den String in der
DLL nicht veränderst bzw irgendwo anderst hin kopierst: Gar nichts. Wenn Du ihn aber weiter referenzierst kracht es da dann die Referenzzählerei von Exe und
DLL durcheimander kommen. Fall C ist praktisch wie Fall b solange du den String nicht verändern darfst (Deshalb steht oft in der
VCL bei Aufrufen in die
Win32-
API PChar(MeinDelphiString). Fall b heißt du mußt dann mit den nicht gerade schönen Funktionen für PChar arbeiten.
Zitat von
gmc616:
Ich habe aus dem DynRecord mal ein Object ( = class (TObject) ) gemacht und ebenfalls den Zeiger in die
DLL gegeben.
Das gleiche. Nach FreeLibrary ist das Object zerstört.
Ohne gemeinsamen Memory-Manager: Russisches Roulette.
Zitat von
gmc616:
Ich dachte bis jetzt, dass bei der "normalen" Übergabe von Variablen eine Kopie im Speicher stellt mit der dann (im meinem Fall die
DLL) weiter gearbeitet wird. Da die Übergabe von Delphi-Strings in eine
DLL ohne Speichermanager nicht funktioniert, dachte ich mir, ich zeige der
DLL wo die Daten stehen indem ich nur einen Pointer rüber reiche.
So gebe ich der
DLL quasi nur eine Zahl, die Daten stehen im Adressbereich der Hauptanwendung und ich kann auf den Speichermanager verzichten.
Dies gilt nur für skalare Typen wie Boolean, Int, Float. Für Objekte und den Sondertyp (Delphi-String) gelten gesonderet Regeln (Objekte wird nur die Referenz übergeben und der Delphi-
Ansi-String verwendet Refernzzählung.
Zitat von
gmc616:
Naja, freilich das klapp solange wie sich die Größe der Daten nicht ändert ...
Das scheint wohl mein Denkfehler zu sein.
Aber wie denkt man es richtig?
Ich werde erst mal die Strings in PChar ändern. Mal sehen ob das klappt.
Wie holt man Speicher für diese "Strings" korrekt?
Ohne Memorymanager darfst Du nur mit C-Kompatiblen-Typen arbeiten. "Strings" (PChars) reservierst du mit StrAlloc (müßte es aus der Hüfte geschossen sein).
Windows Vista - Eine neue Erfahrung in Fehlern.