Hallo hab hier eine Funktionsdeklaration!
typedef void (_stdcall *AN21XXOPENDEVICE)(unsigned char ucDeviceNumber, char* szDriverName, char* szID, char* szKeyword);
Was muß ich aber jetzt schreiben wenn ich diese benutzen will!?
Was muß ich beim Aufruf alles weglassen!? Kann mir jemand ein Beispiel machen?
Thanks @ all
Programmieren - alles kontrollieren 4.941 Themen, 20.715 Beiträge
z.b.: (*AN21XXOPENDEVICE)(0, "EZUSB", "Meier", "00A7325BC901" );
Tatsächlich sollte der eigene code eingetragen werden, die werte oben sind aus der dokumentation.
Vor der verwendung von AN21XXOPENDEVICE muss aber zuerst mit GetProcAddress() (einmal) die einsprungadresse aus der DLL abgefragt werden (siehe "USB_Interface.cpp").
mr.escape
Danke erstmal für deine vielen Antworten!
Habs so versucht wie oben von dir gezeigt mit dem (*AN21XXOPEN......)
Bekomm dann vom Compiler aber immer den Fehler:
[C++ Error] Unit1.cpp(15): E2451 Undefined symbol 'AN21XXOPENDEVICE'
Dazu muß ich aber sagen hab zwei cpp Dateien in einem Projekt, wie kommunizieren jetzt die zwei cpp Dateien miteinander? Da die Funktion in der einen cpp stehen ich den Aufruf jedoch in der anderen cpp mach!? Die cpp Datei mit den Funktionen/Deklarationen usw. kann allein nicht kompiliert werden deshalb hab ich eine zweite eingefügt die dann noch das Formular usw. enthält!
Was muss ich machen das diese beiden cpp Dateien mit einander kommunizieren?
Thanks @ all
Danke erstmal für deine vielen Antworten!
Habs so versucht wie oben von dir gezeigt mit dem (*AN21XXOPEN......)
Bekomm dann vom Compiler aber immer den Fehler:
[C++ Error] Unit1.cpp(15): E2451 Undefined symbol 'AN21XXOPENDEVICE'
Dazu muß ich aber sagen hab zwei cpp Dateien in einem Projekt, wie kommunizieren jetzt die zwei cpp Dateien miteinander? Da die Funktion in der einen cpp stehen ich den Aufruf jedoch in der anderen cpp mach!? Die cpp Datei mit den Funktionen/Deklarationen usw. kann allein nicht kompiliert werden deshalb hab ich eine zweite eingefügt die dann noch das Formular usw. enthält!
Was muss ich machen das diese beiden cpp Dateien mit einander kommunizieren?
Thanks @ all
CPP-Dateien kommunizieren nicht miteinander. Ein Compiler erzeugt aus den CPP-Dateien OBJ-Dateien, also Binärcode und Zusatzinformationen für den Linker. Diese Zusatzinformationen enthalten im wesentlichen Exports, also Funktionen, die von außen aufgerufen werden können, und Imports, Funktionen die außerhalb liegen. Der Linker verbindet diese Teile zu einem Programm. Deshalb muss man Symbole die nicht in der CPP-Datei selber stehen, bekannt machen, indem man sie *deklariert*: "extern int EinZahl;" oder durch einen Funktionsprototyp oder eine Klassendeklaration.
Da man das nicht jedesmal hinschreiben will, inkludiert man Header-Dateien, die diese Informationen beinhalten.
Wenn, wie in diesem Fall der Compiler ein undefiniertes Symbol anmeckert, dann fehlt entweder ein #include oder man hat einen Tippfehler oder ähnliches.
Mit scheint allerdings, du hast keinen blassen Schimmer von C/C++-Programmierung. Vielleicht solltest du dich erst einmal ein bisschen mit diesen Programmiersprachen vertraut machen, bevor du solche Dinge versuchst. Versuch's mal mit googeln "C++ tutorial deutsch" oder lass deutsch weg, wenn auch englisch sein darf.
Claus
Hallo Claus,
danke erstmal für die Antwort! Hab diese DLL ja nicht selber gemacht die hab ich so gekauft! Nur der der die Software verkauft hat keine Ahnung im Borland! Wollte die DLL ohne Lib File einbinden was " anscheinend" geht (also nur über die .cpp und .h File)! Ging aber nicht! Daraufhin hat er mir nur ne cpp Datei geschickt mit der ich die Funktionen direkt ansprechen kann(ohne Header File)! Da liegt das Problem wenn ich diese öffne kann ich sie nicht kompilieren, deshalb hab ich noch en neues projekt geöffnet dann gehts! aber kann die funktionen halt nicht in der Unit.cpp (die ich ja neu angelegt hab) aufrufen!
Brauch die DLL leider für meine Technikerarbeit!
Wenn ich das nun recht deute, was du da zusammengeschrieben hast, dann hast du folgende Sitatuation:
Du hast eine CPP-Datei von extern, die einiges an Code bereitstellt, den du nutzen willst (Nennen wir sie mal fremd.cpp). Und du hast eine eigene CPP-Datei (eigen.cpp), die die Routinen in fremd.cpp benutzen soll. fremd.cpp kannst du übersetzen, wenn du es in eigenes Projekt stopfst.
Politisch korrekt wäre es jetzt, eine Header-Datei fremd.h zu entwerfen, die die Typdefinitionen, Variablendeklarationen und Funktionsprototypen enthält, die fremd.cpp öffentlich bereitstellen will. Diese fremd.h inkludierst du dann oberhalb deines eigenen Codes via '#include "fremd.h"' in die eigen.cpp.
Ein politisch nicht korrekter aber pragmatischer und funktionierender Ansatz: Schreibe '#include "fremd.cpp"' vor deinen eigenen Code. Solange du sowas nicht mehr als einmal im Projekt machst, geht es. Ansonsten kommt der Linker mit einer Fehlermeldung über doppelte Symbole.
Ansonsten ist die Aufgabe, für eine cpp-Datei eine h-Datei zu schreiben nicht wirklich schwierig.
BTW: Für eine DLL braucht man (neben der h-Datei) auch immer eine Lib-Datei. Die enthält aber nicht den eigentlichen Programmcode (der steckt in der DLL) sondern nur den (technischen) Code, der notwendig ist, um die Funktion aus der DLL ansprechen zu können, ohne dass sich der Programmierer noch um diese Dinge kümmern muss.
Claus
Hoppla, da habe ich wohl das "typedef" übersehen.
typedef void (_stdcall *AN21XXOPENDEVICE)(unsigned char ucDeviceNumber, char* szDriverName, char* szID, char* szKeyword);
HINSTANCE m_hLibInstance;
AN21XXOPENDEVICE fpOpenDevice;
m_hLibInstance = LoadLibrary("an21xx.dll");
fpOpenDevice = (AN21XXOPENDEVICE)GetProcAddress(m_hLibInstance, "OpenDevice");
(*fpOpenDevice)(0, "EZUSB", "Meier", "00A7325BC901" );
Die "typedef"-zeile wird i.a. nicht direkt im sourcecode stehen, sondern z.b. per:
#incluse "USB_Interface.h"
(ebenso, wie auch all die anderen typedefs, etc.) eingebunden.
LoadLibrary und GetProcAddress brauchen nur einmal am anfang, in der initialisierungsphase aufgerufen werden (GetProcAddress nur einmal für jede verwendete funktion).
Das problem mit den mehreren *.cpp dateien stellt sich hier nicht denn die funktionen kommen aus einer DLL. Wie und was aus der DLL kommt, steht in der entsprechenden *.h datei und evtl. in der dokumentation (hier: der typedef in der *.h datei und der parameter "OpenDevice" für GetProcAddress() im quelltext von z.b. "USB_Interface.cpp").
Hat man wirklich *.cpp dateien mit klassen, variablen und funktionen, die in anderen *.cpp dateien verwendet werden sollen, so müssen alle extern verwendeten klassen, variablen und funktionen in *.h dateien deklariert werden. Diese *.h dateien werden dann in jeder *.cpp datei, die etwas von den dort deklarierten sachen verwendet per #include eingebunden.
Ein c/c++-tutorial wäre dazu wirklich nicht schlecht.
Z.b.:
deklaration, kommt in *.h, z.b. "foo.h"
int foo(int i);
bedeutet: es gibt (irgendwo) eine funktion mit dem namen "foo", die als parameter eine int-zahl erwartet und auch eine int-zahl als ergebnis zurück gibt.
die implementierung kommt in *.cpp, z.b. "foo.cpp". Name ist egal, muss nur im projekt vorhanden sein
int foo(int i){
return i*i;
}
jetzt kommt die verwendung in einer anderen *.cpp datei
#include "foo.h"
...
int i=foo(10);
mr.escape
Das ist keine Funktionsdeklaration, sondern eine Typdefinition, wie das erste Schl�sselwort es ganz klar ausdr�ckt. Definiert wird ein Funktionstyp, der eine unsigned char als ersten und je ein char* als die n�chsten drei Parameter und keinen R�ckgabewert hat.
Nun kann man soetwas hinschreiben wie:
OpenDevice (AN21XXOPENDEVICE OpenFunc)
{
OpenFunc (1, "DriverName", "ID", "Keyword");
}
also die aufzurufende Funktion als Parameter �bergeben.
Eine andere Verwendung ist das casten von Funktionsadressen:
AN21XXOPENDEVICE OpenFunc = (AN21XXOPENDEVICE) GetProcAddress (MyDllHandle, "FunctionName");
Der Aufruf von OpenFunc erfolgt dann wie oben. Der direkte Aufruf
(GetProcAddress (MyDllHandle, "FunctionName")) (1, "DriverName", "ID", "Keyword")
w�rde nicht compiliert werden, wie man schnell feststellt.
Claus
... "void OpenDevice (AN21XXOPENDEVICE OpenFunc)" hei�en.
Sorry f�r das nutzlose Posting eben. Quotes im Betreff sind wohl nicht zul�ssig.
Claus