LabVIEWForum.de
DLL einbinden in CVI funktioniert nicht - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: Weitere NI Software (/Forum-Weitere-NI-Software)
+---- Forum: LabWINDOWS/CVI (/Forum-LabWINDOWS-CVI)
+---- Thema: DLL einbinden in CVI funktioniert nicht (/Thread-DLL-einbinden-in-CVI-funktioniert-nicht)



DLL einbinden in CVI funktioniert nicht - Spetznatz - 15.04.2008 10:38

Hallo,

ich versuche eine Dll-Datei in mein LabWindowsprogramm einzufügen.
Ich habe über Edit->Add files to project die entsprechende Library Datei ins Projekt eingefügt und auch das *.h File mit den Funktionen (siehe Anhang).

Leider reagiert mein Programm kein bißchen auf die eingefügten Dateien. Wenn ich das ganze Zeug aus dem Projektordner lösche, kommt keine Fehlermeldung, nichts. Irgendwie reagiert CVI nicht auf meine *.dll.

Ich hatte vorher ein Beispielprogramm eines NI-Tutorials ausprobiert und dort funktionierte die einbindung der *.dll, siehe http://zone.ni.com/devzone/cda/epd/p/id/2770.
Auch die anderen Hilfeseiten von NI zu dem Thema konnten mir bisher nicht helfen.

Jedoch ist mir aufgefallen das mein *.h File eine komplett andere Dateistruktur hat als die Datei in dem Beispielprogramm. Es kommten Datentypen wie HANDLE, DWORD, BOOL, etc. vor.

Ich weiß gilt:
#define DWORD unsigned long
#define BYTE unsigned char
#define WORD unsigned short
#define LONG signed long
#define BOOL long

Daher meine zwei Fragen:
1. Wie binde ich den HANDLE Datentyp ein?
2. Welche Funktionen muss ich benutzten das meine DLL aufgerufen wird und nicht nur als unverlinkte Datei im Projektordner verstaubt.

Vielen Dank im Voraus an Alle!!!!


DLL einbinden in CVI funktioniert nicht - rolfk - 21.04.2008 08:16

' schrieb:Hallo,

ich versuche eine Dll-Datei in mein LabWindowsprogramm einzufügen.
Ich habe über Edit->Add files to project die entsprechende Library Datei ins Projekt eingefügt und auch das *.h File mit den Funktionen (siehe Anhang).

Leider reagiert mein Programm kein bißchen auf die eingefügten Dateien. Wenn ich das ganze Zeug aus dem Projektordner lösche, kommt keine Fehlermeldung, nichts. Irgendwie reagiert CVI nicht auf meine *.dll.

Ich hatte vorher ein Beispielprogramm eines NI-Tutorials ausprobiert und dort funktionierte die einbindung der *.dll, siehe http://zone.ni.com/devzone/cda/epd/p/id/2770.
Auch die anderen Hilfeseiten von NI zu dem Thema konnten mir bisher nicht helfen.

Jedoch ist mir aufgefallen das mein *.h File eine komplett andere Dateistruktur hat als die Datei in dem Beispielprogramm. Es kommten Datentypen wie HANDLE, DWORD, BOOL, etc. vor.

Ich weiß gilt:
#define DWORD unsigned long
#define BYTE unsigned char
#define WORD unsigned short
#define LONG signed long
#define BOOL long

Daher meine zwei Fragen:
1. Wie binde ich den HANDLE Datentyp ein?
2. Welche Funktionen muss ich benutzten das meine DLL aufgerufen wird und nicht nur als unverlinkte Datei im Projektordner verstaubt.

Vielen Dank im Voraus an Alle!!!!

Ich denke Du hast hier ein seriöses Missverständnis. Alleine dadurch dass Du die Importlibrary und das Headerfile einer DLL in ein Projekt einfügst passiert noch absolut nichts. Du wirst auch ein Programm schreiben müssen dass die Funktionen dieser DLL sinnvoll aufruft. Denn wenn Du das getan hättest würdest Du Compiler- und Linkerfehler bekommen, wenn Du diese Files wieder aus dem Projekt entfernst.

Ein DLL ist ganz einfach eine Funktionslibrary, und die Importlibrary ist der Kleber der Dir die Verwendung dieser DLL in einem Programm erleichtert. Genau gleich wie das Einfügen eines Instrumentendrivers in ein Projekt diese Instrument noch nicht anspricht geht das auch mit DLLs. Irgendwo wirst Du ein eigenes C File machen müssen mit einer main() oder WinMain() Funktion die dann irgendwie und in sinnvoller Art die Funktionen dieser DLL aufruft.

Um den Datentyp Handle zu benützen brauchst Du nichts weiter zu tun als ein #include "<dein header file>" am Anfang Deines C Files.

Danach wirst Du wohl irgenwie ein Programm schreiben müssen in dem Du die Funktionen MPUSBGetDeviceCount(), MPUSBOpen(), MPUSBRead(), MPUSBWrite(), und MPUSBClose() aufrufst. Wie diese Funktionen aufgerufen werden müssen wirst Du der Dokumentation zu Deinem Gerät entnehmen müssen. Ein C Code Example dabei wäre natürlich auch noch sehr nett, aber das können wir für Dich nicht tun. Das ist eindeutig Aufgabe des Geräteherstellers.

Rolf Kalbermatter


DLL einbinden in CVI funktioniert nicht - Spetznatz - 22.04.2008 16:58

Sorry hab mich wohl etwas unglücklich ausgedrückt.

Ein C Programm zum aufrufen und verwenden der Funktionen habe ich natürlich, es funktionierte bloß nie richtig ;-). Ich verwende dort andere Datentypen und eben nicht Sachen wie DWORD, PVOID, HANDLE, usw. .
Ich dachte, dass ich die Windows SDK Datentypen durch gleichwertige Datentypen (wie z.B. unsigned char) ersetzten könnte um die Integration in mein Programm zu erleichtern.
Das ist leider nicht so einfach wie ich es mir zuerst vorgestellt hatte...

Mittlerweile habe ich die *.dll Idee aber schon verworfen und steuere mein Gerät mit diversen VISA-Funktionen an, die dass gleiche machen wie die Funktionen in der *.dll. Zur Hälfte funktioniert das im Moment auch und insgesamt ists übersichtlicher.

Trotzdem vielen Dank für deine ausführliche Antwort! Ich glaube nicht das ich das letzte Mal mit dem Problem konfrontiert bin.


DLL einbinden in CVI funktioniert nicht - coca - 25.10.2008 10:05

Ich hatte genau das selbe Problem.

Im Header meiner dll war ein Datentyp nicht bekannt, PSTCTR, das gab eine Fehlermeldung beim compilen.

Im Header der dll hab ich anschließend die windows.h includiert wodrin dieser Datentyp enthalten ist und anschließend eine neue *.LIB erstellt und es hat alles funktioniert.


Ein weiteres Problem was ich mit dieser dll hatte, vieleicht intressierts oder auch nicht, finde nur das war so ein kleiner
holper Stein den man ruhig mal erzaehlen kann.

Die dll ist in c++ geschrieben worden und ich hatte Probleme eine Funktion in meinem Code aufzurufen. Er erkannte diese einfach nicht, obwohl sie im Header stand.
Sah quasi so aus:
" int test(){xxxx}"
Wenn man jetzt " int test(void){xxxx}" schreibt erkennt der C compiler von cvi diese Funktion auch Big Grin

Eigentlich recht einfach die Lösung nur, wenn man gerad ein Problem gelöst hat und gleich das naechste kommt
sieht man die Lösung nicht sofort.

Hoffe das hilft ein wenig.


DLL einbinden in CVI funktioniert nicht - Y-P - 25.10.2008 10:38

Danke für die Info.Top2

Gruß Markus

' schrieb:Ich hatte genau das selbe Problem.

Im Header meiner dll war ein Datentyp nicht bekannt, PSTCTR, das gab eine Fehlermeldung beim compilen.

Im Header der dll hab ich anschließend die windows.h includiert wodrin dieser Datentyp enthalten ist und anschließend eine neue *.LIB erstellt und es hat alles funktioniert.
Ein weiteres Problem was ich mit dieser dll hatte, vieleicht intressierts oder auch nicht, finde nur das war so ein kleiner
holper Stein den man ruhig mal erzaehlen kann.

Die dll ist in c++ geschrieben worden und ich hatte Probleme eine Funktion in meinem Code aufzurufen. Er erkannte diese einfach nicht, obwohl sie im Header stand.
Sah quasi so aus:
" int test(){xxxx}"
Wenn man jetzt " int test(void){xxxx}" schreibt erkennt der C compiler von cvi diese Funktion auch Big Grin

Eigentlich recht einfach die Lösung nur, wenn man gerad ein Problem gelöst hat und gleich das naechste kommt
sieht man die Lösung nicht sofort.

Hoffe das hilft ein wenig.



DLL einbinden in CVI funktioniert nicht - rolfk - 19.12.2008 21:31

' schrieb:Ich hatte genau das selbe Problem.

Im Header meiner dll war ein Datentyp nicht bekannt, PSTCTR, das gab eine Fehlermeldung beim compilen.

Im Header der dll hab ich anschließend die windows.h includiert wodrin dieser Datentyp enthalten ist und anschließend eine neue *.LIB erstellt und es hat alles funktioniert.
Ein weiteres Problem was ich mit dieser dll hatte, vieleicht intressierts oder auch nicht, finde nur das war so ein kleiner holper Stein den man ruhig mal erzaehlen kann.

Tippfehler?? PSTCTR ist kein Windows Datentyp und kommt in meinem Ganzen Windows SDK nirgends vor. Meinst Du vielleicht etwas wie (L)PCTSTR? Das wäre ein Pointer auf ein constant string und je nachdem ob Du UNICODE defined hast oder nicht ein ASCII oder WIDECHAR String.

An sich ist es so dass ein Header File zu einer Library natürlich alle Datentypen die verwendet werden definieren sollte. Aber bei Libraries die in Windows application verwendet werden geht der Programmierer oft davon aus dass windows.h eh schon durch die Anwendung selber included wird.

Im Sinne der Kompatibilität mit späteren Versionen der Library ist es eine schlechte Idee um Header Files einer Library zu verändern. Wenn Du dann upgradest wirst Du das Header File meist auch ersetzen und dann hast Du schon ziemlich sicher vergessen dass Du die frühere Version selber angepasst hast. Besser wäre es vor dem Einbinden Deiner Header Datei ein #include <windows.h> innerhalb des Source Codes zu machen der Deine Library verwendet.
Zitat:Die dll ist in c++ geschrieben worden und ich hatte Probleme eine Funktion in meinem Code aufzurufen. Er erkannte diese einfach nicht, obwohl sie im Header stand.
Sah quasi so aus:
" int test(){xxxx}"
Wenn man jetzt " int test(void){xxxx}" schreibt erkennt der C compiler von cvi diese Funktion auch Big Grin

Nein! Er erkennt sie nicht sondern implementiert sie selber. Auch hier hast Du das Problem dass bei Ersetzen des Headers bei einem Update diese Funktion vielleicht geupdatet wurde Du aber in Deinem Source Code halt die alte Version noch verwendest.

Das Problem ist dass der Programmierer der Library leider vergessen hat die Funktionsdeklarationen als extern "C" zu deklarieren. Das verhindert dass der C++ Compiler diese Funktionsnamen dekoriert (myTest(x, y, z) wird dann zu sowas wie myTest$2%34ds%^sd() gemacht) und diese Funktion auch unter diesem Namen exportiert. Da die C++ Funktionsdekoration compilerspezifisch ist ist eine Library mit C++ exported Funktionsnamen im Grossen und Ganzen einfach blöder Quatsch.

Eine einfache Lösung dieses letzten Problems gibt es wirklich nicht.

Rolf Kalbermatter


DLL einbinden in CVI funktioniert nicht - coca - 16.03.2009 13:17

Ja ist richtig LPCTSTR ist gemeint.

Wenn du eine DLL gestellt bekommst, dazu eine Header und daraus eine *.LIB Datei erstellen möchtest.
Geht es definitiv nicht in den Programm Modulen diese Header die benötigt wird einzubinden
und dann eine *.LIB Datei zu erstellen.

Der einzige weg ist es die Header in dem Fall <windows.h> in die Header der DLL zu inkludieren es gibt keine andere
möglichkeit ! Ausser deine Variante funktioniert, habe ich nicht getestet, weil sie nicht gehen wird.

Es ist nicht sauber realisiert, aber so ersparr ich mir eine MySql Anwendung an einen Mac-Adressen Server selber zu schreiben

Da ich kein Dipl. inf bin, habe ich mich auch leider trivial ausgedrückt, ich dachte jeder weiss was damit gemeint ist. Wenn ich sage der Compiler hat die Funktion nicht erkannt.
Was er mir ja qausi auch im builder schreibt auf english, das er die Funktion nicht kennt.

Aber deine Ausführung ist absolut korrekt schande über mich das ich mich so unkorrekt ausgedrückt habe.

P.S. ich dachte erkannt zu haben das Spetznatz ein änliches Problem hatte wie ich und so wollte ich meine praktische
Erfahrung einfach teilen.
Es tut mir leid wenn meine Ausführung zu Trivial und sachlich nicht korrekt in der Wortwahl gewesen ist.