![]() |
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 |
AW: Standardunits in dll einbinden
Was machst du genau? Tauscht du evtl. über die DLL-Schnittstelle "lebende" Objekte oder Strings aus?
|
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 |
AW: Standardunits in dll einbinden
Welche Delphi-Version? Alle Patches installiert? Win32 oder .NET?
|
AW: Standardunits in dll einbinden
Zitat:
|
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:
Grüße
const
c_1 = 'xx'; c_2 = 100; const c_3 = 20; c_4 = 'yy'; Ralf |
AW: Standardunits in dll einbinden
Und wenn du die beiden Bereiche "vereinigst"?
|
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. |
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 |
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 ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:07 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