INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

DLL einbinden in CVI funktioniert nicht



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

15.04.2008, 10:38
Beitrag #1

Spetznatz Offline
LVF-Grünschnabel
*


Beiträge: 14
Registriert seit: Feb 2008

7
2006
de

36286
Deutschland
DLL einbinden in CVI funktioniert nicht
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!!!!


Angehängte Datei(en)
Sonstige .txt  Neu_Textdokument.txt (Größe: 1,91 KB / Downloads: 650)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
21.04.2008, 08:16 (Dieser Beitrag wurde zuletzt bearbeitet: 21.04.2008 08:23 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL einbinden in CVI funktioniert nicht
' 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

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.04.2008, 16:58
Beitrag #3

Spetznatz Offline
LVF-Grünschnabel
*


Beiträge: 14
Registriert seit: Feb 2008

7
2006
de

36286
Deutschland
DLL einbinden in CVI funktioniert nicht
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.10.2008, 10:05 (Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2008 10:13 von coca.)
Beitrag #4

coca Offline
LVF-Neueinsteiger


Beiträge: 2
Registriert seit: Oct 2008

CVI/Labwindwos 8.1
-
en

13355
Deutschland
DLL einbinden in CVI funktioniert nicht
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.10.2008, 10:38
Beitrag #5

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
DLL einbinden in CVI funktioniert nicht
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.

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
19.12.2008, 21:31
Beitrag #6

rolfk Offline
LVF-Guru
*****


Beiträge: 2.306
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
DLL einbinden in CVI funktioniert nicht
' 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

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.03.2009, 13:17
Beitrag #7

coca Offline
LVF-Neueinsteiger


Beiträge: 2
Registriert seit: Oct 2008

CVI/Labwindwos 8.1
-
en

13355
Deutschland
DLL einbinden in CVI funktioniert nicht
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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: