Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 05:05

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mi Mär 09, 2005 13:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
Also ich habe mal ne prinzipielle Frage: was muss ich beachten wenn ich eine Dll die eine Klasse beinhalten soll schreiben will, die ich auch in c++ verwenden will? kann man da was falsch machen oder schreib ic die einfach in delphi compilier das und kann nach dem schreiben eines passenden headers für c das ding auch dort nutzen ?
erzählt mir mal was darüber, hat da jemand schon Erfahrung mit gemacht ?
Vielen Dank für eure Hilfe.

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 13:55 
Offline
DGL Member

Registriert: Mo Jan 20, 2003 20:10
Beiträge: 424
Wohnort: nähe Starnberg
Soviel ich weis, gibt es keine Möglichkeit Delphi - Klassen in einer DLL zupacken und dann über C++ anzusprechen, Ausnahme ist hier der C++Builder von Borland. Das liegt einfach daran, das die VMT, wie sie von Delphi implementiert wurde, nicht dem C++ Compiler bekannt ist und somit kann er die Einsprung - Tabelle zu den Methoden garnicht auswerten.

Gruß
KidPaddle

_________________
http://www.seban.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 14:09 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
das ist ja böld. gilt das auch andersherum ? oder kann ich c++-klassen in eine dll packen und von jeder anderen sprache ansprechen ?

geht es denn überhaupt klassen in eine dll zu packen ?

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 14:29 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Wenn du Klassen an andere Programmiersprachen weitergeben möchtes, dann sind interface am besten. Ist ja das gleiche wie bei DirectX. Da Interface aber keinen Konstruktur haben können, müßte man dann dafür eine spezielle Funktion exportieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 15:03 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also ich habe schon Aktiv C++ Klassen in Delphi verwendet und glaube mir, wenn es eine andere Möglichkeit gibt nutze sie!!! Die Klassen müssen speziell exportiert werden und das einlesen ist noch schlimmer. Da muss jedes Byte in der Definition übereinstimmen. Also Reihenfolge, Type der Parameter und auch die der Methoden. Sonst springt er vollkommen andere Methode an und reicht total schwachsinnige Daten an sie. Debuggen kann man das natürlich auch, da ja keine Methode sinnvoll angesprungen wird. Und die Klassen mussten dann in einer exportierten C++ Methode erstellt und auch wieder frei gegeben werden. Also das war ein Krampf pur. Ob das auch mit anderen Sprachen als Delphi kann ich aber nicht sagen.

Ich würde dir ans Herz legen, dass du es so machst wie es bei OpenGL der Fall ist. Also eine Methode die dir eine Klasse erstellt und dir eine ID zurückgibt und bei jedem anderen Aufruf musst du halt wieder die ID übergeben. Das macht alles wesentlich einfacher und kann dann von jeder Sprache aus verwendet werden.

Dabei solltest du auch darauf achten, dass du nur Standardtypen verwendest. Also Integer, Cardinal, Boolean gehen. Aber auf keinen Fall String. Da musst du einen Nullterminierten Pointer verwenden. Records würde ich weg lassen. Und Arrays als Pointer auf das erste Element übergeben.

Oder eben die von Lars vorgeschlagenen Interfaces. Aber das dürfte interessant werden wenn du dich damit nicht auskennst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 19:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
also ich kenne mich nicht interfaces aus, aber das dürfte nichts sein was sich nicht aneignen kann, oder ?! also ich hatte gehofft eine ähnliche lösung wie für die directX sachen zu finden (sprich: interfaces). das ganze wird aber nicht so aufwendig, da es sich dabei bloß um eine einzige klasse handelt die ich in der DLL habe.

gibt es zu der verwendung von interfaces in dem zusammenhang ein tutorial, dass ihr mir empfehlen könntet ?

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 20:05 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Empfhelenswerte Tutorials zu Delphi findet man bei Delphi-Source. Bei denen findet man eigentlich zu allem ein Tutorial. (Da kann man fast ein bisl neidisch werden :? )

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 20:06 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Hier ist ein kurzer Überblick: http://www.dsdt.info/grundlagen/sprache/interfaces.php
Im Wesentlichen geht es bei dem Interface darum eine Schnittstelle aus Methoden und Properties zu definieren, die dann von einer Klasse implementiert wird. Für den Benutzer des Interface spielt die Klasse und ihre Vererbungshierachie dann keine Rolle mehr und daher ist das eine sehr flexible Methode.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 09, 2005 23:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
das hört sich ja einfach an.heißt doch das ich einfach die class die in der dll is als interface in einer unit definiere und alle functionen als public ins interface schreiben, dann das ding mit dem GUID und dann noch von TInterfacedObject ableiten und feddich oder ?

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 10, 2005 01:02 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Du brauchst noch eine Funktion, die eine Instanz von dem Objekt erstellt, weil Interfaces keine Klassenfunktionen und Konstruktoren enthalten können. So ungefähr sähe das dann aus.

Code:
  1.  
  2.  
  3. interface
  4.  
  5. type
  6.  
  7. ITestObject = interface
  8.  [... GUID....]
  9.  procedure Methode1;
  10.  procedure Methode2;
  11. end;
  12.  
  13. TTestOject = class(TInterfacedObject,ITestObject)
  14.  procedure Methode1;
  15.  procedure Methode2;
  16. end;
  17.  
  18. implementation
  19.  
  20. function CreateTestObject:ITestObject;
  21. begin
  22.  result := TTestObject.create as ITestObject;
  23. end;
  24.  
  25. procedure TTestOject.Methode1;
  26. begin
  27. end;
  28.  
  29. procedure TTestOject.Methode2;
  30. begin
  31. end;
  32.  
  33. exports
  34.  CreateTestObject;
  35.  
  36.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 10, 2005 07:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
Heißt also, bei der klassen-def kann ich mir eines von dem beiden aussuchen :
Code:
  1.  
  2. ITestObject = interface
  3.  [... GUID....]
  4.  procedure Methode1;
  5.  procedure Methode2;
  6. end;
  7.  
  8. TTestOject = class(TInterfacedObject,ITestObject)
  9.  procedure Methode1;
  10.  procedure Methode2;
  11. end;

??
So noch eine kleinigkeit.
Die klasse die dann also in c in eine library exportiert wurde muss die auch noch irgendwelche besonderheiten haben ?
oder ist das eine ganz normale klasse?
beispiel:
class cCamera
{
private:
Vector3 m_vEye,m_vAt,m_vUp,m_vDir;
bool m_bMouseInvert;

void RotateView(float angle, float x, float y, float z);
public:
cCamera();
~cCamera();

float fAx,fAy;

void SetPos(Vector3 vP);
void SetDir(Vector3 vD);
void SetOnHeight(float h);
Vector3 GetPos();
Vector3 GetDir();
void MoveDir(Vector3 vM);
void SetMatrix();
void MouseLook();
};
alle functionen (incl.) "RotateView" werden dann public im interface gemacht ? oder enthalte ich die private functions dem interface vor ?

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 10, 2005 09:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ich weiß zwar nicht wie du das mit aussuchen meinst aber in Delphi dient das Interface nur dazu um die Schnittstelle zu beschreiben. Die Implementierung findet in der Klasse statt. Diese bekommt ja auch gesagt, dass es folgendes Interface benutzen soll. Aber du kannst keine Klasse nach C exportieren. Das ist immer das Interface. Und in C musst du ein Interface deklarieren. Das darf keine Klasse sein. Wenn ich mich nicht irre muss das dann sogar die selbe GUID wie dein Delphiinterface haben damit du es ansprechen kannst. Du könntest in C zusätzlich noch eine Klasse deklarieren die das Interface benutzt. Das wäre aber nur ein Wrapper dafür. Und meines Wissens nach gibt es keine privaten Methoden in einem Interface. Die wären dann wieder in der Klasse. In dem Interface sind alle Methode automatisch public. Du kannst zusätzlich noch Propertys definieren. Die benötigen aber Read und Write methoden. Also die können natürlich nicht auf Variablen zugreifen, weil die ja auch erst in der Klasse definiert werden können.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 17:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
so die interfaces haben mich doch überfordert. hab es nun so gemacht wie ihr es mir schon vorher ans herz gelegt habt. auf dem openGL weg. reicht in meinem fall auch völlig aus. es handelt sich e nur um eine klasse die man braucht und die wird auch nur zwei/drei öffentliche functionen haben, das klappt also auch sehr bequem indem ich nur diese paar functionen im openGL - stil exportiere.
danke jungs

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 17:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 12:26
Beiträge: 53
Wohnort: Dornbirn
Soweit ich weiß ist es ganz und gar unmöglich Klassen in DLL's zu kriegen.
DLL's sollen ja zu ALLEN Programmiersprachen kompatibel sein, auch zu denen, die noch keine Klassen unterstützen. (z.B. C)

Aber es gibt ja auch andere Mittel und Wege Objektorientiert ohne Klassen zu Programmieren. (mit Hilfe von Strukturen, etc...)

_________________
Good software is like sex, it's best when it's free


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 12, 2005 22:32 
Offline
DGL Member
Benutzeravatar

Registriert: Do Mär 06, 2003 15:27
Beiträge: 281
Wohnort: Bochum
det is nu wirklich quatsch. es ist nun wirklich gar kein problem eine Klasse in einer DLL zu halten. sieh dir nur mal die DirectX-SDK an, sind ja alles klassen.
Wie dem auch sei, ich hab getz meine Klasse in der DLL drin, verzichte aber auf das exportieren jener, da dass ja eben das Prolem ist. ich mach es also wie OpenGL. trotzdem danke

_________________
www.extrawurst.org


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]