Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FastMM/ShareMem für Lazarus? (https://www.delphipraxis.net/132682-fastmm-sharemem-fuer-lazarus.html)

I.A 17. Apr 2009 11:45


FastMM/ShareMem für Lazarus?
 
Hallo,

vor einigen Tagen hab ich ne Frage zu DLLs, erstellt mit Lazarus gestellt. Sollte über Interfaces mit Delphi zu verbinden sein.

Aber gibt es ein Äquivalent für ShareMem bzw. FastMM für Lazarus, wenn Huge Strings oder AnsiStrings übertragen werden sollen bzw. in den von der DLL verwendeten Units verwendet werden?

Die DLL soll mit Lazarus ersstellt und dann mit Delphi verwendet werden. Aber ShareMem bzw FatMM muss sowohl im Projekt als auch in der DLL verwendet werden.

Falls FastMM angepasst werden kann: Müssen in der Lazarus DLL und im Delphi Projekt dann die Versionen der FastMM übereinstimmen?

DeddyH 17. Apr 2009 11:58

Re: FastMM/ShareMem für Lazarus?
 
Vielleicht hilft Dir das weiter: http://www.freepascal.org/contrib/delete.php3?ID=543

himitsu 17. Apr 2009 12:03

Re: FastMM/ShareMem für Lazarus?
 
ShareMem nutzt eine DLL und leitet Speicher-Anfragen an diese DLL um ... du könnstest also ganz einfach ebenfalls diese DLL nutzen (allerdings darfst du sie nicht dem FreePascal-Programmteil beilegen, da sie ja Codegear gehört, aber wenn der Delphi-Teil diese DLL mitbringt, dann dürfte es "keine" Probleme geben)


Du müßtests dann nur APIs der ShareMem-DLL implementieren und den MemoryManager des FreePascal-Programms auf diese DLL umleiten.

I.A 19. Apr 2009 06:58

Re: FastMM/ShareMem für Lazarus?
 
Hallo,

Danker erst mal für Eure Antworten. Leider hilft keiner der Tipps. Ich erhalte nach wie vor eine EAccessviolation.

Die Unit Sharemem gibt es auch für Freepascal. Die Delphi Unit kann leider nicht einfach angepasst werden, weil die TMemorymanager-Records unterschiedlich definiert sind.

Delphi-Quellcode:
type
  //Delphi Definition
  PMemoryManager = ^TMemoryManager;
  TMemoryManager = record
    GetMem: function(Size: Integer): Pointer;
    FreeMem: function(P: Pointer): Integer;
    ReallocMem: function(P: Pointer; Size: Integer): Pointer;
  end;

  //Freepascal Definition
  PMemoryManager = ^TMemoryManager;
  TMemoryManager = record
    NeedLock           : boolean;
    Getmem             : Function(Size:ptrint):Pointer;
    Freemem            : Function(p:pointer):ptrint;
    FreememSize        : Function(p:pointer;Size:ptrint):ptrint;
    AllocMem           : Function(Size:ptrint):Pointer;
    ReAllocMem         : Function(var p:pointer;Size:ptrint):Pointer;
    MemSize            : function(p:pointer):ptrint;
    GetHeapStatus      : function :THeapStatus;
    GetFPCHeapStatus   : function :TFPCHeapStatus;
  end;

  //Zusätzlich für Delphi aber nicht für Freepascal
  PMemoryManagerEx = ^TMemoryManagerEx;
  TMemoryManagerEx = record
    {The basic (required) memory manager functionality}
    GetMem: function(Size: Integer): Pointer;
    FreeMem: function(P: Pointer): Integer;
    ReallocMem: function(P: Pointer; Size: Integer): Pointer;
    {Extended (optional) functionality.}
    AllocMem: function(Size: Cardinal): Pointer;
    RegisterExpectedMemoryLeak: function(P: Pointer): Boolean;
    UnregisterExpectedMemoryLeak: function(P: Pointer): Boolean;
  end;
  //Die letztere wird von Delphi-ShareMem verwendet
Ich fociere deshalb den Tipp von DeddyH -> http://www.freepascal.org/contrib/delete.php3?ID=543
Doch leider erhalte ich auch hier eine EAccessviolation.

Da sind bei mir folgende Fragen entstanden:

Wen ich eine Freepascal Komponente von Delphi aus ansprechen und damit kommunizieren will:

1). Ist der Owner der Komponente dann NIL oder Application?

2). TMemoryManager ist unterschiedlich definiert in Freepascal/Delphi. Kann eine Dll mit Klasse
damit überhaupt funktionieren, wenn die Klasse in der DLL mit Freepascal übersetzt ist aber mit Delphi weiter verwendet werden soll?

delphifan2004 19. Apr 2009 07:58

Re: FastMM/ShareMem für Lazarus?
 
Hallo,

hast Du mal probiert, Deine Klasse in ein Projekt zu packen, dieses als Exe zu übersetzen und mit der Exe zu kommunizieren?

Müsste doch über Interfaces klappen. Weiß aber grad nicht, wie man einen gemeinsamen Speicherbreich dabei hinkriegt. Keine Ahnung, ob OLE der Schlüssel zum Erfolg ist.

I.A 19. Apr 2009 14:26

Re: FastMM/ShareMem für Lazarus?
 
Hallo,

Juuuubellll, ich habb's geschafft. Mir hatte die fpcmemdll.dll gefehlt. Da geht es mit Sharemem.
:hello:
Die andere Variante mit ExportFPCClass geht auch, aber ist von der Systematik her nicht so schön.
:firejump:
Werd aber mal ein Standardverfahren erarbeiten, das für alle diese Fälle (Kommunikation zwischen Freepascal- und Delphi Programmteilen funktioniert.

@Delphifan2004: Danke für die Anregung. Habe zwar keine Ahnung von OLE. Aber mit Memory Mapped Files könnte die Kommunikation funktionieren. :coder2:

Welche generellen Probleme gint es außer der Kommunikation zwischen Klassen oder der Übertragung von beliebigen Strings noch zu lösen?

Worauf muss ich bei der Erarbeitung einer Standardlösung noch achten? Oder ist OLE, ActiveX u.a. der Schlüssel zu einer Standardlösung für das Problem der Kommunikation zwischen Klassen im System?

Da ich bei der einfachen Kommunikation zwischen Klassen, die von verschidenen Compilern erstellt wurden einige Probleme zu lösen hatte, denk ich, das die Problematik von allgemeinem Interesse sein könnte. Ist das der Fall?

Was müsste ich in eine Standardbibliothek zur Lösung des Problems unbedingt noch einbauen, damit das Problem allgemeingültig gelöst werden kann, ohne die Verrenkungen bei den Dlls mit Sharemem, FastMM oder ExportClassFPC?
:gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:46 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