Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Standardunits in dll einbinden (https://www.delphipraxis.net/153511-standardunits-dll-einbinden.html)

xml99 5. Aug 2010 19:14

Standardunits in dll einbinden
 
Hallo Zusammen,

Ich lade in meinem Hauptprogramm statisch eine mit Delphi erstelle dll. Das funktioniert gut, solange ich keine weiter (dcu-)unit in der dll angebe.

Erweitere ich meine uses-Liste mit Sysutils oder Classes oder Math, so kommt beim Beenden (automatischen entladen) der dll eine access violation. Entferne ich die units aus der uses-Liste beendet es sich ohne Fehlermeldung.

Ich möchte in einer meiner exportieren functionen Ceil aus der unit Math benutzen. Nehme ich die unit Math in die uses-Liste auf, kann ich zwar Ceil benutzen, beim beenden des Pogramms erhalte ich aber eine access violation.

Die Abbruchstelle ist in der Funktion "RemoveMediumFreeBlock" des MemoryManagers (ist wohl FastMM4, da ich Delphi 2007 benutze?).

Hat jemand eine Idee? Was mache ich falsch? Es soll doch sogar möglich sein Formulare (unit Forms) einbinden zu können?

Danke und Grüße
Ralf

Bernhard Geyer 5. Aug 2010 19:33

AW: Standardunits in dll einbinden
 
Was machst du genau? Tauscht du evtl. über die DLL-Schnittstelle "lebende" Objekte oder Strings aus?

xml99 5. Aug 2010 20:38

AW: Standardunits in dll einbinden
 
Hallo Bernhard,

Nein, es werden integer, double, currency und strings zurückgegeben. Ich möchte in der dll Berechnungen durchführen. Dazu benötige ich Ceil aus der unit Math.

Wenn Math eingebungen ist (also in der uses-Liste steht) dann gibt es nach dem Beenden des Hauptprogramms einen Runtime Fehler 216, ohne Math (und auskommentierter Berechnung) passiert dies nicht.

Es reicht auch Sysutils in die uses-Liste einzufügen (zwar wird sie nicht benötigt, ich wollte nur ausschliessen, dass es an einer bestimmten unit also Math liegt), selber Effekt. Auch eigene bel. units (die wiederum Delphi unist einbinden) führen zu dem gleichen Problem.

Ich kann es mir nicht erklären, was da passiert.

Grüße
Ralf

Bernhard Geyer 5. Aug 2010 21:13

AW: Standardunits in dll einbinden
 
Welche Delphi-Version? Alle Patches installiert? Win32 oder .NET?

SirThornberry 5. Aug 2010 21:17

AW: Standardunits in dll einbinden
 
Zitat:

Zitat von xml99 (Beitrag 1039900)
Nein, es werden integer, double, currency und strings zurückgegeben.

Strings sind lebende "Objekte". Hast du dafür den Hinweis welcher ganz oben in einem DLL-Projekt steht beachtet und ShareMem genutzt?

xml99 6. Aug 2010 06:09

AW: Standardunits in dll einbinden
 
Hallo,

Wie bereits geschrieben benutze ich Delphi 2007, Win32, alle Patches vorhanden (CodeGear™ Delphi® 2007 für Win32® R2 Version 11.0.2902.10471.).

Bei Benutzung von FastMM4 ist keine borldmm.dll nötig und es können auch (Delphi)-strings verwendet werden. Delphi 2007 benutzt einen "abgespeckten" FastMM4. Es gibt auch keine Einschränkungen in der Funktionalität.

Noch ein "interessantes" Detail: wenn ich in einer Source zweimal aufeinanderfolgend einen Bereich der mit const eingeleitet wird habe, kommt es beim Starten der Anwendung zu einer Access violation (??? das begreife wer will ???), also

Delphi-Quellcode:
const
  c_1 = 'xx';
  c_2 = 100;

const
  c_3 = 20;
  c_4 = 'yy';
Grüße
Ralf

mkinzler 6. Aug 2010 06:35

AW: Standardunits in dll einbinden
 
Und wenn du die beiden Bereiche "vereinigst"?

himitsu 6. Aug 2010 07:46

AW: Standardunits in dll einbinden
 
Auch bei FastMM muß man erstmal die eingebaute SharedMemory-Funktion aktivieren,
ansonsten nutzen die DLL und die EXE immernoch jeder einen eigenen Speichermanager und schon iser der Hinweis auf den String wieder aktuell.

PS: Du kannst auch einfach WideString nutzen, denn dieser ist ein Sonderfall, da er nicht über den DelphiSpeichermanager/FastMM behandelt wird.

xml99 6. Aug 2010 08:51

AW: Standardunits in dll einbinden
 
Hallo,

Danke für die Antworten.

@mkinzler: dann gibt es keine access violation beim Beenden des Hauptprogramms.

@himitsu: Danke für den Hinweis mit den Strings. Das ist aber nicht die Ursache. Z.B. Sysutils in der uses Anweisung der dll vorhanden -> access violation, nicht vorhanden alles ok. Ich meine DN gelesen zu haben, dass der FastMM4 jetzt der MM von Delphi ist (ab Delphi 2007) und keine dll oder unit mehr benötigt wird.

Grüße
Ralf

himitsu 6. Aug 2010 09:43

AW: Standardunits in dll einbinden
 
Ja, im Delphi ist nun eine abgespeckte/angepaßte Version von FastMM4 enthalten (vermutlich ein FastMM 4.7x oder 4.6x), aber dieser ist nicht standardmäßig auf SharedMemory eingestellt.

Bei dem Modul (EXE/DLL), von welchem der MM geshared werden soll, da muß dieser über die Funktion ShareMemoryManager zum Sharing freigegeben werden.
(bei einer statisch geladenen DLL also in der DLL , ansonsten in der EXE ... also da, was zuerst geladen wird)

Dort, wo der MM genutzt werden soll, da muß dieser über die Funktion AttemptToUseSharedMemoryManager importiert werden (vor jeglicher Nutzung des eigenen MMs, also möglichst in einer Unit als Erstes der DPR)

Man kann aber auch einfach die Unit SimpleShareMem in beide/alle Module (EXE und DLL), jeweils als erste Unit in der DPR aufnehmen, dann kümmert sich diese Unit um das Sharen.

Näheres dazu ist dort zu lesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:36 Uhr.
Seite 1 von 2  1 2      

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