AGB  ·  Datenschutz  ·  Impressum  







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

Standardunits in dll einbinden

Ein Thema von xml99 · begonnen am 5. Aug 2010 · letzter Beitrag vom 6. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
xml99

Registriert seit: 2. Feb 2005
Ort: Köln
13 Beiträge
 
Delphi 2007 Professional
 
#1

Standardunits in dll einbinden

  Alt 5. Aug 2010, 20:14
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Standardunits in dll einbinden

  Alt 5. Aug 2010, 20:33
Was machst du genau? Tauscht du evtl. über die DLL-Schnittstelle "lebende" Objekte oder Strings aus?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
xml99

Registriert seit: 2. Feb 2005
Ort: Köln
13 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Standardunits in dll einbinden

  Alt 5. Aug 2010, 21:38
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Standardunits in dll einbinden

  Alt 5. Aug 2010, 22:13
Welche Delphi-Version? Alle Patches installiert? Win32 oder .NET?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Standardunits in dll einbinden

  Alt 5. Aug 2010, 22:17
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
xml99

Registriert seit: 2. Feb 2005
Ort: Köln
13 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Standardunits in dll einbinden

  Alt 6. Aug 2010, 07:09
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

Geändert von mkinzler ( 6. Aug 2010 um 07:35 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Standardunits in dll einbinden

  Alt 6. Aug 2010, 07:35
Und wenn du die beiden Bereiche "vereinigst"?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Standardunits in dll einbinden

  Alt 6. Aug 2010, 08:46
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
xml99

Registriert seit: 2. Feb 2005
Ort: Köln
13 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Standardunits in dll einbinden

  Alt 6. Aug 2010, 09:51
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Standardunits in dll einbinden

  Alt 6. Aug 2010, 10:43
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 6. Aug 2010 um 10:46 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:24 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