![]() |
Record mit Widestring am DLL übergeben bei XE2
Hallo!
Ich komm grad bei der Übergabe eines Records an eine DLL-Procedure nicht weiter. Der Record enthält eine Widestring-Variable, welche leer an die DLL übergeben wird, dort geschrieben werden soll und dann innerhalb der Anwendung weiter verarbeitet. Mein Textcode funktioniert so lange wie ich die dynamisch geladene DLL per FreeLibrary wieder entlade. Dann gibt der Speichermanager alles frei was innerhalb der DLL existiert hat und ich bekomme logischerweise in der Anwendung eine AV. Kommentiere ich das FreeLibrary einfach aus funktioniert es wunderbar. Was mich da stutzig macht: Ich bekomme trotz FastMM4 beim Schließen der Anwendung keine Memleaks angezeigt, obwohl die DLL nicht richtig entladen wurde. Wobei mir wichtiger ist zu verstehen, wie man Widestrings richtigerweise mit DLLs austauscht und die Inhalte der Widestrings über das FreeLibrary hinaus "konserviert". Hier mein Testcode:
Delphi-Quellcode:
// === Die DLL ===
library MyDLL; uses FastMM4, System.SysUtils, System.Classes, ModuleInfo in '..\..\Common\ModuleInfo.pas'; {$R *.res} procedure GetModuleInfo(AModuleInfo: PModuleInfo); stdcall; const MODULENAME: String = 'My DLL'; begin if AModuleInfo <> NIL then begin AModuleInfo^.ModuleName:= MODULENAME; end; end; exports GetModuleInfo; begin end. // === ModuleInfo.pas === unit ModuleInfo; interface uses Windows, SysUtils; type TModuleInfo = record ModuleName: String; end; PModuleInfo = ^TModuleInfo; TModuleInfoProc = procedure (AModuleInfo: PModuleInfo); stdcall; function GetModuleInfo(const AModuleFile: TFileName; AModuleInfo: pModuleInfo): Boolean; implementation function GetModuleInfo(const AModuleFile: TFileName; AModuleInfo: PModuleInfo): Boolean; var hDLL: THandle; hProc: TModuleInfoProc; begin result:= FALSE; hDLL:= SafeLoadLibrary(AModuleFile); if hDLL <> 0 then begin @hProc:= GetProcAddress(hDLL, 'GetModuleInfo'); if Assigned(hProc) then begin hProc(AModuleInfo); result:= TRUE; end; // FreeLibrary(hDLL); <-- Die magische Zeile ;-) end; end; end. // === Die Hostanwendung === procedure TForm1.Button1Click(Sender: TObject); var MI: TModuleInfo; Path: TFileName; begin Path:= IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'Modules\MyDLL.dll'; if GetModuleInfo(Path, @MI) then begin Label1.Caption:= MI.ModuleName; // <-- Mit FreeLibrary gibts hier die AV end; end; |
AW: Record mit Widestring am DLL übergeben bei XE2
Du arbeitest nicht mit Widestrings sondern bei XE2 mit Unicodestrings.
Widestrings werden von Windows-MM verwaltet. Unicodestrings vom Delphi-MemoryManager. Laufen beide (DLL/Exe) mit FastMM wirst du bei Unicodestrings vermutlich das Define "AttemptToUseSharedMM" benötigen |
AW: Record mit Widestring am DLL übergeben bei XE2
Man ich geh gleich baden... :-) Du hast vollkommen recht. Ich habe mir für D7 (womit ich eigentlich am häufigsten code) und XE2 zwei verschiedene Verzeichnisse für FastMM4 angelegt. In der D7-Version hatte ich die Shared Mem Optionen vor langer Zeit schon aktiviert und jetzt bei XE2 wunder ich mich dass das nicht so will wie ich es von D7 gewohnt bin ^^
Mit den Unicodestrings haste auch recht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 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-2025 by Thomas Breitkreuz