Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Einbinden einer DLL (https://www.delphipraxis.net/20958-einbinden-einer-dll.html)

Killer 25. Apr 2004 22:07


Einbinden einer DLL
 
Hi hab mir bei meinem neuen Projekt ne DLL (in Delphi geschrieben) eingebunden, die dann aus der Anwendung statisch geladen wird. Es klappt auch fast, ich bekomm aber beim Start eine Exception der Klasse EPrivilege und zwar mit der Meldung "Privilegierte Anweisung".

Weiß irgendwer was das zu bedeuten hat??? :roll:

Update:
Hab grad gegoogelt und das hier dazu gefunden:

$00DA - 218 - Priviligierte Instruktion
Typ: Schwerer Fehler

EPrivilege wird ausgelöst, wenn eine Anwendung versucht, eine Prozessoranweisung auszuführen, die in der gegenwärtigen Prozessor-Vorrangstufe nicht zulässig ist.

SirThornberry 25. Apr 2004 22:48

Re: Einbinden einer DLL
 
wenn du den code aus der dll mit in die hauptanwendung machst, funktionierts dann?? Ansonsten würd ich eifnach mal drauf tippen das in der dll was gemacht wird das nicht zulässig ist oder die aufrufkonvention nicht stimmt (stdcall etc...)

Killer 25. Apr 2004 23:21

Re: Einbinden einer DLL
 
Jep wenn ich den Code in die Anwendung schreibe dann gehts auch. Ich hab den Code ursprünglich in der Anwendung gehabt und wollte ihn in die DLL auslagern.

Den Aufruf hab ich mit stdcall gemacht.
Also so: procedure GetTree(Tree: TTreeView); stdcall; external 'function.dll'

SirThornberry 25. Apr 2004 23:42

Re: Einbinden einer DLL
 
probier mal obs geht wenn du mit sharemem arbeitest.

Dax 26. Apr 2004 06:21

Re: Einbinden einer DLL
 
Wenn ich mich nicht irre musst du hinter dem "external 'function.dlll'" auch noch mit nameden Funktionsnamen angeben. UNd das mit ShareMem könnte auch stimmen. Statt mit TreeViews zu arbeiten solltest du lieber Pointer auf TreeViews übergeben.

Muetze1 26. Apr 2004 08:16

Re: Einbinden einer DLL
 
Moin!

Zitat:

Zitat von Dax
Wenn ich mich nicht irre musst du hinter dem "external 'function.dlll'" auch noch mit nameden Funktionsnamen angeben.

Nein, muss man nicht, wenn der Funktionsname gleich ist. Ansonsten hat man auch die Möglichkeit anstatt des Namens den Index der Funktion anzugeben.

Zitat:

Zitat von Dax
UNd das mit ShareMem könnte auch stimmen.

Tut es auch. Die ShareMem muss immer eingebunden werden, wenn übergebene Werte oder auch Werte innerhalb von Klassen(instanzen) mit Strings arbeiten (ausser ShortStrings). Und dieses ist bei einem TTreeView eindeutig der Fall (jedes Element ab und einschliesslich TPersistent sogar).

Zitat:

Zitat von Dax
Statt mit TreeViews zu arbeiten solltest du lieber Pointer auf TreeViews übergeben.

Das macht kein Unterschied und ist eigentlich schon fast doppelt gebastelt. Das ist wirklich egal in diesem Falle...

@Killer: Du hast die Funktion in deinem Projekt mit "stdcall;" Konvention definiert - aber hast du stdcall; auch bei der Funktion in der DLL selber auch angegeben????

MfG
Muetze1

Killer 26. Apr 2004 09:07

Re: Einbinden einer DLL
 
Ups da muss ich heute Abend mal nachschauen ob ich stdcall in der DLL angegeben habe.

Was mich noch ein wenig ärgert, ist dass die DLL mit 2 Funktionen schon 350kB Dateigröße hat. Irgendwie aber auch wieder verständlich, da ich 4 Units in die DLL eingebunden habe (bzw. muss)...ne Möglichkeit wär ja die DLL mit C zu schreiben, aber da weiß ich dann nich wie es mit dem TreeView geht... :shock:

Muetze1 26. Apr 2004 09:10

Re: Einbinden einer DLL
 
Moin!

Zitat:

Zitat von Killer
...ne Möglichkeit wär ja die DLL mit C zu schreiben, aber da weiß ich dann nich wie es mit dem TreeView geht... :shock:

Wieso? Nimm einen C++Builder.

MfG
Muetze1

shmia 26. Apr 2004 09:40

Re: Einbinden einer DLL
 
Zitat:

Zitat von Killer
Was mich noch ein wenig ärgert, ist dass die DLL mit 2 Funktionen schon 350kB Dateigröße hat. Irgendwie aber auch wieder verständlich, da ich 4 Units in die DLL eingebunden habe (bzw. muss)...ne Möglichkeit wär ja die DLL mit C zu schreiben, aber da weiß ich dann nich wie es mit dem TreeView geht... :shock:

Wenn du Programmcode auslagern möchtest und nur von Delphi aus benutzen willst, dann sind
DLLs ungeeignet. Stattdessen musst du einfach ein Package erzeugen und alle Units, die
du auslagern möchtest "hineinstopfen".
Sowohl dein eigenes Package, als auch deine Anwendung müssen dann ihrerseits Packages
(VCL60, VCLX60, VCLDB60, ...) benützen; nur dann wird deine Anwendung und dein Package
wenig Speicherplatz benötigen.

In deinem Fall mit der DLL ist nichts gewonnen, denn den Programmcode der VCL befindet
doppelt in deiner Anwendung und in der DLL.
Ein weiterer Nachteil: eine neuere Anwendung könnte auf eine ältere Version deiner
DLL treffen und schon passen die Funktionsaufrufe nicht zusammen => Absturz.
Hier müsste man die Version der DLL überprüfen.

Killer 26. Apr 2004 14:52

Re: Einbinden einer DLL
 
@Muetze1:

Ich meinte eigentlich auch C++, mit dem Unterschied, dass ich den C++ Builder nicht besitze, aber Visual C++ schon.

shmia:

Hast auch wieder recht. Naja ich glaub ich lager das Zeugs lieber in Units aus :)


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