AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ShareMem bzw. FastMM mit DLL

Ein Thema von ele · begonnen am 9. Mär 2010 · letzter Beitrag vom 22. Mär 2010
Antwort Antwort
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#1

ShareMem bzw. FastMM mit DLL

  Alt 9. Mär 2010, 15:25
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#2

Re: ShareMem bzw. FastMM mit DLL

  Alt 9. Mär 2010, 17:16
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 von ele:
Die Schnittstelle benutzt Interfaces, weswegen der Einsatz von ShareMem nötig ist.
Ein Interace selber setzt kein ShareMem voraus ... das ist ja schließlich ein Vorteil gegenüber Objekten.

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
> ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#3

Re: ShareMem bzw. FastMM mit DLL

  Alt 9. Mär 2010, 19:14
Ich habe zwei Funktionen die mein Plugin exportiert:

Delphi-Quellcode:
function GetInterfaceVersion(): AnsiString;
begin
  Result := rbInterfaceVersion;
end;

function RegisterWebApplication(ARaspberryServerAPI: IrbAPI): IrbWebApplication;
begin
  Result := TrbwDemoWebApp.Create(ARaspberryServerAPI);
end;
Also habe ich nach deinem Vorschlag AnsiString in WideString geändert:

Delphi-Quellcode:
function GetInterfaceVersion(): WideString;
begin
  Result := rbInterfaceVersion;
end;
Das scheint anfangs ganz gut zu funktionieren, aber beim Beenden des Programmes knallts dann doch.

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:
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes.
ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
Ich weiss, dass es schwer nachzuvollziehen ist, wenn man keinen Code hat. Aber weil ich mein Mammut-Projekt schlecht in das Forum stellen kann, habe ich husch husch eine kleine Demo-Anwendung zusammengestellt, die im wesentlichen gleich funtioniert. Es wäre auch ein hübsches Beispiel wie man ein Plugin programmiert, wenn es dazu nicht schon genug Beiträge gäbe. (Wer ein funktionierendes Beispiel will muss halt FastMM4 durch ShareMem ersetzen und die borlndmm.dll ins Exe-Verzeichnis stellen).

Wenn jemand da reinblicken könnte, wäre ich sehr dankbar.
Angehängte Dateien
Dateityp: zip dllplugintest_122.zip (11,1 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: ShareMem bzw. FastMM mit DLL

  Alt 9. Mär 2010, 21:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.080 Beiträge
 
Delphi 12 Athens
 
#5

Re: ShareMem bzw. FastMM mit DLL

  Alt 9. Mär 2010, 22:04
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#6

Re: ShareMem bzw. FastMM mit DLL

  Alt 10. Mär 2010, 12:00
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.
  Mit Zitat antworten Zitat
ele

Registriert seit: 18. Feb 2009
129 Beiträge
 
Delphi 2010 Professional
 
#7

Re: ShareMem bzw. FastMM mit DLL

  Alt 22. Mär 2010, 14:39
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:
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;
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

Delphi-Quellcode:
procedure TPlugin.SayHello(const Language: String);
var
  ErrorMessage: String;

begin
  ProtectedCall(FPluginDLL.SayHello(Language)); // Aufruf der DLL-Methode
end;
wäre schön, ist aber so wie ich das sehe nicht realisierbar, da Delphi keine Makros kennt.
Schade...
Angehängte Dateien
Dateityp: zip dllplugintest_878.zip (17,3 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:07 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