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


von Christian S. (wirres_zeug)


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:
1
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)


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:

Lesenswert?

Ich weiß nicht, ob ich den ganzen Header posten darf. Hier jedenfalls 
die ersten Zeilen, danach geht es nur noch mit Finktionen weiter.
1
//define 
2
#define STA_TIMEOUT  5
3
#define ADDERR       -100
4
5
6
class MDCE;
7
8
// call this beore any function in case application is not MFC
9
void setMFCmode();
10
11
12
// manage com ( if pcom =NULL ) get the default pcom as created from the last openPcom
13
char * ver(int print);  // if print=1 put message box with MPI dll version, else only return str message with version information
14
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)


Lesenswert?

dann würde ich einfach mal das

class MDCE;

ignorieren, es scheint dann nicht notwendig zu sein.

von Oliver (Gast)


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)


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)


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)


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)


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)


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)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.