Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Win32 Dll erzeugen (https://www.delphipraxis.net/116890-win32-dll-erzeugen.html)

lazcad 8. Jul 2008 11:37


Win32 Dll erzeugen
 
Hallo,

ich habe lange nichts mit Delphi gemacht und jetzt möchte ich eine Win23 Dll mit Delphi erzeugen.

Dabei habe ich 2 interne Funktionen und eine externe. Rufe ich die interne Funktion auf, bekomme ich "nicht deklarierter Bezeichner". Warum ?

Delphi-Quellcode:
library Project1;

uses
  SysUtils,
  Classes;

{$R *.res}

function Calc (x,y :Byte): word; stdcall;
begin
  Result:= Addieren (x,y); // <--- nicht deklarierter bezeichner Addieren ???
end;

function Addieren(x, y: Byte): Word; // stdcall;
begin
  Result := x + y;
end;

function Subtrahieren(x, y: Byte): ShortInt; //stdcall;
begin
  Result := x - y;
end;

// exports Addieren; // index 1;
// exports Subtrahieren; // index 2;
exports Calc;

begin
end.
Kann mir jemand einen Tip geben, wie das Problem zu lösen ist ?

Danke !

Gruß
Stefan

Assertor 8. Jul 2008 11:42

Re: Win32 Dll erzeugen
 
In dem Du Addieren vor Calc verschiebst.

Gruß Assertor

Die Muhkuh 8. Jul 2008 11:43

Re: Win32 Dll erzeugen
 
Hi Stefan,

füge vor dem Calc mal das hier ein:

Delphi-Quellcode:
function Addieren(x, y: Byte): Word; forward;

Luckie 8. Jul 2008 11:51

Re: Win32 Dll erzeugen
 
Da du keine Klasse mit einer Deklaration hast, in der die Methoden bekannt gemacht werden - auch für den Compiler, sondern eine einfache Sammlung von Routinen in einer Unit, geht der Compiler von oben nach unter vor. Und wenn er in der Funktion calc auf den Funktionasaufruf Addiere stößt, weiß er damit nichts anzufagen, weil die Funktion Addiere erst weiter unten im Quelltext implementiert wird.

Du hast jetzt zwei Möglichkleiten, die beide schon erwähnt wurden. Entweder du sortierst die Funktionen in deinem Quellcode um, was hier noch möglich ist, oder aber, wenn das nicht möglich ist, kannst du dem Compiler die Routinen auch mit sogenannten Delphi-Referenz durchsuchenfoward-Deklarationen bekannt machen:
Delphi-Quellcode:
function Addieren(x, y: Byte): Word; forward;
Das reicht schon, weil der Compiler nur wissen muss, wie der Funktionskopf aussieht, um entscheiden zu können, ob die Funktion korrekt aufgerufen wird.

Das noch mal zum Verständnis zu den Lösungen meiner Vorposter.

Die Muhkuh 8. Jul 2008 11:53

Re: Win32 Dll erzeugen
 
Hab es jetzt nicht ausprobiert, aber wäre es nicht möglich eine Klasse mit Klassenmethoden zu erstellen und diese zu exportieren?

Luckie 8. Jul 2008 11:58

Re: Win32 Dll erzeugen
 
bei Klassen in einer DLL bin ich immer vorsichtig. Außerdem halte ich die Lösung mit Klassenmethoden für etwas übertrieben. Und was mir noch einfällt, mit Klassenmethoden können eventuell andere Programmiersprachen nichts anfangen. Ach und wie willst du die exportieren? Das wären jedenfalls noch Punkte, die geklärt werden müssten und die eventuell Probleme bereiten könnten.

Apollonius 8. Jul 2008 12:07

Re: Win32 Dll erzeugen
 
Wenn die Klassenmethoden mit der Direktive "static" deklariert werden, wird kein Self-Parameter entgegengenommen, also können sie aus anderen Sprachen benutzt werden. Allerdings weiß ich nicht, ob Delphi den Export erlaubt.

Luckie 8. Jul 2008 12:08

Re: Win32 Dll erzeugen
 
Die Direktive static gibt es aber auch erst in den neueren Delphi Versionen oder?

Apollonius 8. Jul 2008 12:16

Re: Win32 Dll erzeugen
 
Wenn ich die Dokumentation richtig verstanden habe, gibt es sie erst ab BDS 2006 in Win32.

Reinhardtinho 8. Jul 2008 12:17

Re: Win32 Dll erzeugen
 
So eine DLL könnte man nicht in C einbinden, sehe ich das richtig?

Luckie 8. Jul 2008 12:23

Re: Win32 Dll erzeugen
 
Zitat:

Zitat von Reinhardtinho
So eine DLL könnte man nicht in C einbinden, sehe ich das richtig?

Das diskutieren wir gerade. Wenn man keine klare Aussage in der Hilfe oder mit Google findet, müsste man es mal ausprobieren.

Apollonius 8. Jul 2008 12:26

Re: Win32 Dll erzeugen
 
Statische Klassenmethoden sind eigentlich normale Routinen, die in einem Namensraum zusammengefasst sind. Insofern kann man sie, sofern eine C-kompatible Aufrufkonvention verwendet wird, durchaus aus C aufrufen. Die Frage ist, ob Delphi den Export erlaubt.

lazcad 9. Jul 2008 12:40

Re: Win32 Dll erzeugen
 
Hallo an alle,

vielen Dank für eure Tips, ich werde es testen.

Diese Dll sollte auch von C oder anderen Programmiersprachen erreichbar sein, durch stdcall in der Funktionsdeklaration soll das laut Beschreibung möglich sein.

Ich werde die Tage alles testen und melde mich dann noch mal

Gruß
Stefan

Cyf 9. Jul 2008 13:13

Re: Win32 Dll erzeugen
 
Diese dll in C einzubinden sollte nicht das Problem sein, aber die Frage ist, ob es auch mit statische Klassenmethoden funktioniert, aber eigentlich gehört das nicht mehr in diesen Thread.


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