![]() |
ShareMem bzw. FastMM mit DLL
Hallo,
Ich habe ein kleines Problem und hoffe, dass mir jemand dabei weiterhelfen kann. Ich bin dabei ein Webserver in Delphi 2010 zu Programmieren. Dieser kann Web Applications laden, die in Form einer Plugin-DLL vorliegen. Die Schnittstelle benutzt Interfaces, weswegen der Einsatz von ShareMem nötig ist. Soweit so gut, funktioniert alles prima nur funktioniert das ReportMemoryLeaksOnShutdown nicht. (Also es gibt nicht direkt eine Fehlermeldung, aber das setzen des Wertes hat einfach keine Auswirkungen. Ich denke das der Memory Manager von ShareMem diese Funktion einfach nicht unterstützt). Ich habe auch schon versucht, das ganze mit FastMM zu lösen, aber dann kriege ich Zugriffsverletzungen. Verschiedene Konfigurationen in der FastMMoptions.inc haben bisher auch nicht gefruchtet (ShareMM, ShareMMIfLibrary, AttemptToUseSharedMM). Ist es irgendwie möglich die Vorteile von ShareMem und FastMM zu kombinieren? Oder anders gesagt: Wie kann ich diese Applikation bzw. Plugins auf Memory Leaks prüfen? |
Re: ShareMem bzw. FastMM mit DLL
ReportMemoryLeaksOnShutdown gehört NUR zum Delphiinternen Speichermanager (FastMM)
Wenn man aber ShareMem oder ein externes FastMM nutzt, dann wird der interne Speichermanager durch den externen ersetzt, weßhalb ReportMemoryLeaksOnShutdown da keinen Einfluß haben kann. Zitat:
Welche Parameter/Results setzen denn dieses voraus? Wenn man da nur Typen nutze, welche nicht über Delphis Speichermanager laufen, dann benötigt man kein ShareMem. > WideString statt String/AnsiString/UnicodeString > keine dynamischen Arrays > keine Objekte > ... |
Re: ShareMem bzw. FastMM mit DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe zwei Funktionen die mein Plugin exportiert:
Delphi-Quellcode:
Also habe ich nach deinem Vorschlag AnsiString in WideString geändert:
function GetInterfaceVersion(): AnsiString;
begin Result := rbInterfaceVersion; end; function RegisterWebApplication(ARaspberryServerAPI: IrbAPI): IrbWebApplication; begin Result := TrbwDemoWebApp.Create(ARaspberryServerAPI); end;
Delphi-Quellcode:
Das scheint anfangs ganz gut zu funktionieren, aber beim Beenden des Programmes knallts dann doch.
function GetInterfaceVersion(): WideString;
begin Result := rbInterfaceVersion; end; Ich habe das Gefühl, das Interfaces alleine mich nicht retten, da die Interfaces Methoden deklarieren, die ihrerseits wieder Strings und Delphi-Objekte als Parameter haben. Dies könnte ein Hinweis sein: Zitat:
Wenn jemand da reinblicken könnte, wäre ich sehr dankbar. |
Re: ShareMem bzw. FastMM mit DLL
Vielleicht irre ich mich, aber wird WideString nicht auch von Delphis MM verwaltet? Für InterfaceVersion könntest du doch einfach eine Nummer nehmen oder nicht? Alternativ einen String mit begrenzten Zeichen, also array[1..32] of Char oder sowas.
|
Re: ShareMem bzw. FastMM mit DLL
Nein, WideString ist eine Umleitung um OLE-String, welcher über die OleAuth.dll verwaltet wird.
Außerdem kennt auch C diesen String, somit ist es auch praktisch für Plugins in anderen Sprachen. |
Re: ShareMem bzw. FastMM mit DLL
:wall: Ich habe es jetzt hingekriegt... es lag daran, dass ich vor dem FreeLibrary die Interface-Variable nicht auf nil gesetzt hatte. Ich habe das Beispiel korrigiert, läuft jetzt einwandfrei. Auch wenns keine sau zu interessieren scheint...
Trotzdem danke an euch. Edit: Noch als hinweis, falls jemand das gleiche Problem hat: Die Option RequireDebuggerPresenceForLeakReporting muss ausgeschaltet sein, das funktioniert anscheinend nicht mit dynamisch geladenen DLLs. |
Re: ShareMem bzw. FastMM mit DLL
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hatte einen harten Kampf gegen Delphi um das ganze zum laufen zu bringen, wenn aus der DLL Exceptions geworfen werden. Den Kampf habe ich dann gewonnen, das Resultat ist im Anhang.
Leider muss nun jede Methode, welche in der DLL implementiert wird beim Aufruf durch einen Try Except Block geschütz werden:
Delphi-Quellcode:
Das ganze ist einwenig mühsam, besonders wenn in der DLL viele Methoden implementiert sind. Leider wüsste ich keine Möglichkeit um das zu vereinfachen. Sowas wie
procedure TPlugin.SayHello(const Language: String);
var ErrorMessage: String; begin try FPluginDLL.SayHello(Language); // Aufruf der DLL-Methode except On E: Exception do begin ErrorMessage := E.Message; UniqueString(ErrorMessage); raise Exception.Create(ErrorMessage); end; end; end;
Delphi-Quellcode:
wäre schön, ist aber so wie ich das sehe nicht realisierbar, da Delphi keine Makros kennt.
procedure TPlugin.SayHello(const Language: String);
var ErrorMessage: String; begin ProtectedCall(FPluginDLL.SayHello(Language)); // Aufruf der DLL-Methode end; Schade... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:44 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