Forum: PC-Programmierung DLL-C++-Header nach Delphi portieren


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian S. (wirres_zeug)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mal eine Frage an die Delphieexperten: Ich habe hier für die Steuerung 
eines Lineardrives (Hiwin D1) eine DLL (mpi.dll) vorliegen. Diese ist 
offenbar mit VisualC++ erstellt worden und laut Hersteller für die 
Verwendung in VisualC++, VisualBasic und Labview geeignet. Zu der DLL 
habe ich auch die zugehörige Headerdatei.
Unsere Software soll allerdings in Delphi 2010 geschrieben werden, u.a. 
weil in Delphi schon eine breite Codebasis vorhanden ist.

Nun ist an und für sich kein Ding den C++-Header auf Delphi zu 
übertragen um die DLL einzubinden. Was mir aber gerade Kopfzerbrechen 
bereitet ist folgende Zeile im Header:
class MDCE;
Zum einen verstehe ich diese Zeile nicht so ganz, zum anderen weiß ich 
nicht, wie ich das auf Delphi übertragen könnte. Die Klasse ist aber 
wichtig, weil sie von fast allen Funktionen genutzt wird, um auf die 
geöffnete Kommunikation mit dem Drive zuzugreifen.

Zum Verständnis: wird da eine Klasse ohne Methoden und Variablen 
angelegt? (Ja, die Zeile ist vollständig). Kann der Rest dazu in der DLL 
selber stecken? Oder ist das irgendeine Standardklasse? Habe ich 
überhaupt eine Chance, die DLL unter Delphi nutzbar zu machen?

Nach dem was ich im Internet so finden konnte, scheint es nicht zu 
gehen. Aber wirklich sicher bin ich mir noch nicht. Den Hersteller habe 
ich auch angeschrieben, aber das dauert, bis der antwortet.

Danke schonmal für zielführende Antworten,

Christian

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
kannst du mal die ganze Header datei posten? Und schau dir mal die DLL 
mit dem dependensi walker an ob sie C oder C++ iterface hat. (sieht man 
an den exportierten Symbolen)

von Christian S. (wirres_zeug)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiß nicht, ob ich den ganzen Header posten darf. Hier jedenfalls 
die ersten Zeilen, danach geht es nur noch mit Finktionen weiter.
//define 
#define STA_TIMEOUT  5
#define ADDERR       -100


class MDCE;

// call this beore any function in case application is not MFC
void setMFCmode();


// manage com ( if pcom =NULL ) get the default pcom as created from the last openPcom
char * ver(int print);  // if print=1 put message box with MPI dll version, else only return str message with version information
MDCE * openDCE( char *pwdin, char *cnfname);

Das Interface müsste C sein. Im Anhang ist auch noch einmal das, was der 
Dependency Walker ausgibt.

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
dann würde ich einfach mal das

class MDCE;

ignorieren, es scheint dann nicht notwendig zu sein.

von Oliver (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:
> class MDCE;

ist eine Vorwärtsreferenz.

Vermutlich wird in der headerdatei danach ein pointer oder eine Referenz 
der Klasse verwendet, ohne daß die vollständige Klassendefinition an der 
Stelle bekannt ist.

z.B. sowas hier:

MDCE* pVar;

Über die Vorwärtsreferenz weiß der Compiler, daß das ein Pointer bzw. 
eine Referenz auf eine Klasse ist.

Die vollständige Deifnition von MDCE steht dann woanders.

Oliver

von Christian S. (wirres_zeug)


Bewertung
0 lesenswert
nicht lesenswert
Ja, das was Oliver schreibt, klingt schonmal gut. In allen nachfolgenden 
Funktionen wird nämlich ein Pointer auf ein solches MDCE-Objekt mit 
übergeben. Ich hätte vlt. noch etwas mehr vom Header kopieren sollen.

Ich schau nochmal im Demoprojekt nach, ob ich die Klasse finde.

von Christian S. (wirres_zeug)


Bewertung
0 lesenswert
nicht lesenswert
Auch das Demoprojekt brachte keine Erleuchtung bzgl. der Klasse MDCE. 
Ein "Gehe zu Deklaration" bzw. "Gehe zu Definition" führt mich immer in 
die Header-Datei.
Was mir grad noch auffiel: zusätzlich gibt es noch eine LIB-Datei, die 
auch im Demoprojekt mit eingebunden ist.
Kann es nun sein, dass die Klasse in der DLL oder in der LIB definiert 
ist?

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Christian S. schrieb:
> Auch das Demoprojekt brachte keine Erleuchtung bzgl. der Klasse MDCE.
> Ein "Gehe zu Deklaration" bzw. "Gehe zu Definition" führt mich immer in
> die Header-Datei.
auf soetwas verlässt man sich auch nicht, da sucht man einfach über 
alles files.

> Was mir grad noch auffiel: zusätzlich gibt es noch eine LIB-Datei, die
> auch im Demoprojekt mit eingebunden ist.
klar ist auch notwenig, wenn man nicht die dll dynamisch laden will

> Kann es nun sein, dass die Klasse in der DLL oder in der LIB definiert
> ist?
nein.

Du kannst einfach einen Pointer verwenden. Egal von welchen Type. du 
musst nicht wissen was die Klasse kann.

von Christian S. (wirres_zeug)


Bewertung
0 lesenswert
nicht lesenswert
Danke Peter, ich glaub ich habe verstanden, auf was du hinaus willst. 
Ich werde das so probieren und schauen ob es klappt.

von amateur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Zu Delphi gibt es einen ganzen Sack voll Headerdateien für die 
Windows-System-Funktionen (.dll).
Schau Dir die mal an. Das ist nicht sonderlich schwer, vor allem wenn Du 
die C-Header, zu Deinen Bibliotheken hast.

von amateur (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Sorry,
wenn ich von Delphi Headerdateien spreche, meine ich natürlich *.Pas 
ohne die Implementation der Funktionen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.