Häufig gestellte Fragen zum Einsatz von Dynamik Link Libraries mit LabWindows/CVI
Übersicht
In diesem Dokument werden die häufigsten Fragen zur Erstellung und zum Einsatz von Dynamik Link Libraries (DLLs) in LabWindows/CVI beantwortet.
Inhaltsverzeichnis
- Wie werden DLLs mit LabWindows/CVI erstellt?
- Wie bereite ich C-Code für die Verwendung in einer LabWindows/CVI-DLL vor?
- Welches sind die Mindestanforderungen einer DLL in LabWindows/CVI?
- Was ist bei der Erstellung von LabWindows/CVI-DLLs für den Einsatz mit anderen Entwicklungsumgebungen besonders zu beachten?
- Wie können DLLs von Drittanbietern von LabWindows/CVI aus aufgerufen werden?
- Worin besteht der Unterschied zwischen statischem Laden und dynamischem Laden einer DLL?
- Wie werden Importbibliotheken in LabWindows/CVI erstellt bzw. benutzt?
- Wie kann das Windows SDK von LabWindows/CVI aus eingesetzt werden?
- Wie können in Visual C++ erstellte DLLs mit LabWindows/CVI genutzt werden?
- Weitere Informationen zu DLLs in Windows
Wie werden DLLs mit LabWindows/CVI erstellt?
LabWindows/CVI kann zur Erstellung von DLLs als 32-bit-Version eingesetzt werden. Wenn Sie LabWindows/CVI zur Erstellung einer DLL (Programmbibliothek) einsetzen, wird von LabWindows/CVI auch eine Importbibliothek erstellt, die Sie bei Projekten anwenden können, welche die DLL nutzen. Das wird als statische Verknüpfung (statisches Laden) der DLL bezeichnet.
Sie müssen für jede DLL, die Sie erzeugen wollen, ein gesondertes Projekt erstellen. Anhand folgender Schritte wird eine DLL mittels LabWindows/CVI erstellt:
- Wählen Sie Build >> Target Type >> Dynamic Link Library, um die Zieleinstellungen für das DLL-Projekt festzulegen.
- Mit dem Untermenü Build >> Configuration legen Sie fest, ob eine Release-Version oder eine Debug-Version der DLL erstellt werden soll.
- Wenn der Quellcode für die DLL erstellt wurde (siehe Abschnitt Wie bereite ich C-Code für die Verwendung in einer LabWindows/CVI-DLL vor?) wählen Sie Build >> Create Dynamic Link library, um die DLL zu erstellen.
Wenn Sie eine LabWindows/CVI-DLL für die Verwendung mit LabVIEW Real-Time erstellen, müssen Sie dies im Dialogfeld Target Settings (Zieleinstellungen) auswählen. Wählen Sie Build >> Target Settings und anschließend Real-time only im Bedienelement für Run-time support.
Weitere Hinweise zu den Menüoptionen finden Sie unter Creating DLLs in LabWindows/CVI (Erstellen von DLLs in LabWindows/CVI) in der LabWindows/CVI-Hilfe.
Wie bereite ich C-Code für die Verwendung in einer LabWindows/CVI-DLL vor?
Bei der Erstellung einer DLL sind die folgenden Punkte zu beachten, da sie Ihren Quellcode und die Header-Datei beeinflussen können. Weitere Informationen zu diesen Punkten finden Sie unter Preparing Source Code for Use in a DLL (Vorbereitung von Quellcode für den Einsatz in einer DLL) in der LabWindows/CVI-Hilfe.
Einsatz der passenden Aufrufkonvention zur Definition der zu exportierenden Funktionen
Wenn nur in C oder C++ erstellte Programme Ihre DLL verwenden sollen, können Sie die Konvention __cdecl nutzen, um die zu exportierenden Funktionen zu definieren. Soll Ihre DLL auch von Umgebungen wie Microsoft Visual Basic aufgerufen werden können, sind die zu exportierenden Funktionen mit der Aufrufkonvention __stdcall zu definieren.
Das nachstehende Beispiel zeigt den Einsatz von __cdecl mit einer Funktion:
int __cdecl MyCDeclFunction(const char *);
Das nachstehende Beispiel zeigt den Einsatz von __stdcall mit einer Funktion:
int __stdcall MystdCallFunction(const char *);
Wenn Sie keine Aufrufkonvention festlegen, verwendet LabWindows/CVI die Standardeinstellung für die Aufrufkonvention, die unter Options >> Build Options angegeben ist. Weiterführende Informationen finden Sie unter Calling Convention for Exported Functions (Aufrufkonvention für exportierte Funktionen) in der LabWindows/CVI-Hilfe. National Instruments empfiehlt jedoch, eine Aufrufkonvention immer ausdrücklich festzulegen, wenn Sie DLLs erstellen, die in Drittanbieteranwendungen genutzt werden sollen. So wird gewährleistet, dass Kunden, die Ihre DLL verwenden, automatisch die richtige Aufrufkonvention benutzen, wenn sie die Header-Datei der DLL in ihrem Projekt einsetzen.
Festlegen der zu exportierenden DLL-Funktionen und -Variablen
Verwendet ein Programm eine DLL, hat es nur Zugriff auf die Funktionen oder Variablen, die von der DLL exportiert werden. Die DLL kann nur global deklarierte Funktionen und Variablen exportieren. Sie kann keine als statisch definierten Funktionen und Variablen exportieren.
Weitere Informationen finden Sie unter Exporting DLL Functions and Variables (Export von DLL-Funktionen und -Variablen) in der LabWindows/CVI-Hilfe.
Kennzeichnung importierter Symbole in der von Ihnen verteilten Header-Datei der DLL
Falls Ihre DLL in einer C- oder C++-Programmierumgebung verwendet wird, müssen Sie eine Header-Datei mit Ihrer DLL verteilen. Kunden, die Ihre DLL verwenden, benötigen eine Header-Datei, um Informationen über die Funktionen, die Ihre DLL exportiert, und die Parameter und Aufrufkonventionen zu diesen Funktionen zu erhalten. Sie können dieselbe Header-Datei verteilen, die Sie zur Entwicklung der DLL verwenden, wenn Sie die zu exportierenden Symbole entsprechend kennzeichnen. Näheres erfahren Sie unter Marking Imported Symbols in an Include File Distributed with a DLL (Kennzeichnen importierter Symbole in einer mit einer DLL verteilten Include-Datei) in der LabWindows/CVI-Hilfe.
Das Microsoft Developers Network (MSDN) bietet Ihnen zusätzliche Informationen zu den hier beschriebenen Aufrufkonventionen.:
MSDN: __stdcall calling convention
MSDN: __cdecl calling convention
Welches sind die Mindestanforderungen einer DLL in LabWindows/CVI?
Soll eine LabWindows/CVI-DLL eingesetzt werden, muss die LabWindows/CVI Run-Time Engine auf dem System installiert sein. Zudem ist der Zugriff auf alle weiteren von der DLL benötigten Dateien erforderlich. Weiterführende Informationen zur LabWindows/CVI Run-Time Engine finden Sie unter LabWindows/CVI Run-Time Engine in der LabWindows/CVI-Hilfe
Was ist bei der Erstellung von LabWindows/CVI-DLLs für den Einsatz mit anderen Entwicklungsumgebungen besonders zu beachten?
Sie können mit LabWindows/CVI erstellte DLLs von jeder Programmiersprache aus nutzen, die den Einsatz von DLLs mit C-Aufrufkonvention unterstützt. Dazu zählen Entwicklungsumgebungen wie z. B. LabVIEW, TestStand, Visual C++ und Visual Basic 6.0. Jede Entwicklungsumgebung ruft die DLL auf unterschiedliche Weise auf und hat unterschiedliche Beschränkungen. So kann Visual Basic 6.0 beispielsweise nur DLLs aufrufen, deren Aufrufkonvention als __stdcall definiert ist. Hinweise zum Einsatz einer C-DLL in LabWindows/CVI in einer dieser Umgebungen erhalten Sie in der Dokumentation zur Entwicklungsumgebung. Unter Recommendations for Creating a DLL (Hinweise zur Erstellung einer DLL) in der LabWindows/CVI-Hilfe steht Ihnen eine Liste mit Hinweisen zur Verfügung, die Ihnen den Einsatz Ihrer LabWindows/CVI-DLL mit den meisten Entwicklungsumgebungen ermöglicht.
Die Verwendung einer DLL in manchen Entwicklungsumgebungen (wie z. B. Visual Basic 6.0 und TestStand) ist einfacher, wenn die DLL auch eine Typbibliothek umfasst. Die Typbibliothek liefert ausführliche Informationen über die für den Zugriff auf die DLL verwendete Programmierschnittstelle. Um eine Typbibliothek in die DLL zu integrieren, benötigen Sie eine Funktionspanel-Datei (*.fp, function panel) für die DLL. (In der Version LabWindows/CVI 7.0 sowie in späteren Versionen können Sie Options >> Generate Function Tree auswählen, um eine Funktionspanel-Datei von einer Header-Datei zu erzeugen.) Nachdem Sie eine Funktionspanel-Datei erstellt haben, können Sie festlegen, dass dieses Funktionspanel zur Integration einer Typbibliothek in der DLL genutzt werden kann. Wählen Sie Build >> Target Settings, um das Dialogfeld Target Settings zu öffnen. Klicken Sie auf die Schaltfläche Type Library, aktivieren Sie die Option Add type library resource to DLL und geben Sie die Funktionspanel-Datei an, die Sie im Bedienelement Function panel file erstellt haben.
Wie können DLLs von Drittanbietern von LabWindows/CVI aus aufgerufen werden?
Ablauffähige LabWindows/CVI-Programme und DLLs können 32-bit-DLLs laden. Um eine DLL von LabWindows/CVI aus aufzurufen, müssen die DLL-Header-Datei .h und die Importbibliothekdatei .lib verfügbar sein. Sollten Sie nicht über die DLL-Importbibliothek verfügen, können Sie sie mithilfe der in LabWindows/CVI bereitgestellten Werkzeuge erstellen. Weitere Informationen finden Sie im Abschnitt Worin besteht der Unterschied zwischen statischem Laden und dynamischem Laden einer DLL?
Da LabWindows/CVI ein ANSI-C-Compiler ist, kann es nur Funktionen aufrufen, die als C-Aufrufkonvention exportiert wurden. Weitere Informationen finden Sie im Abschnitt Wie können in Visual C++ erstellte DLLs mit LabWindows/CVI genutzt werden?
Worin besteht der Unterschied zwischen statischem Laden und dynamischem Laden einer DLL?
LabWindows/CVI ermöglicht die Verknüpfung mit DLLs mittels der 32-bit-DLL-Importbibliotheken, die Sie bei der Erstellung von 32-bit-DLLs erzeugt haben. Sie können eine Importbibliothek auf unterschiedliche Weise mit Ihrer Anwendung verknüpfen. Die gängigste Methode ist das Hinzufügen der DLL-Importbibliothek .lib zum LabWindows/CVI-Projekt, das die DLL verwendet. Wenn Sie die DLL-Importdatei zum Projekt hinzufügen, wird das Projekt statisch oder implizit mit der DLL verknüpft. Das bedeutet, dass die vom Projekt erzeugte Anwendung die verknüpfte DLL automatisch lädt, wenn das ablauffähige Programm bzw. die DLL geladen wird. Windows muss in der Lage sein, die verknüpfte DLL zu erkennen, wenn das ablauffähige Programm bzw. die DLL geladen wird. Geschieht das nicht, erzeugt Windows eine Fehlermeldung und schließt die Anwendung.
In manchen Fällen ist evtl. keine Importbibliothek vorhanden oder die DLL soll während des Programmablaufs geladen werden, weil sie bedingt und auf Basis bestimmter Logik in Ihrem Programm genutzt werden soll. Außerdem wollen Sie u. U. erst feststellen, ob die DLL existiert, bevor das Programm sie lädt, damit die Anwendung bei fehlender DLL nicht geschlossen wird. In diesen Fällen können Sie die DLL dynamisch laden oder explizit mit ihr verknüpfen, indem Sie die Funktionen des Windows SDK LoadLibrary und GetProcAddress verwenden. Weitere Informationen über den Einsatz dieser Funktionen in LabWindows/CVI finden Sie unter dem Link Wie kann ich auf DLL-Funktionen in einem LabWindows/CVI-Programm zugreifen, ohne die Importbibliothek in das Projekt einzubeziehen? Den Link dazu finden Sie im Abschnitt Weiterführende Links.
Tipp: Wenn die Funktion LoadLibrary die DLL nicht finden kann, zeigt sie eine Fehlermeldung an. Mit der Funktion SetErrorMode des Windows SDK verhindern Sie, dass durch die Funktion LoadLibrary eine solche Fehlermeldung angezeigt wird.
Weiterführende Links:
MSDN: Link Implicitly
MSDN: Link Explicitly
Wie kann ich auf DLL-Funktionen in einem LabWindows/CVI-Programm zugreifen, ohne die Importbibliothek in das Projekt einzubeziehen? (engl.)
MSDN Platform SDK: SetErrorMode
Wie werden Importbibliotheken in LabWindows/CVI erstellt bzw. benutzt?
Wenn Sie LabWindows/CVI zur Erstellung von DLL-Exportfunktionen oder -variablen nutzen, erzeugt LabWindows/CVI automatisch eine Importbibliothek .lib. Je nach Kompatibilitätsmodus ist die Importbibliothek entweder mit Microsoft Visual C++ oder Borland kompatibel. Diese Compiler verwenden bei der Importbibliothek unterschiedliche Formate. Daher müssen Sie unterschiedliche Importbibliotheken für sie generieren. Sie können für beide Compiler gleichzeitig Importbibliotheken erzeugen, indem Sie die Voreinstellung der Auswahlmöglichkeiten für die Importbibliothek im Dialogfeld Target Settings ändern. Ausführliche Informationen über den Einsatz von LabWindows/CVI mit den unterstützten externen Compilern finden Sie unter Compiler/Linker Issues (Hinweise zu Compilern/Linkern) in der LabWindows/CVI-Hilfe.
LabWindows/CVI kann ebenfalls Importbibliotheken für DLLs mit C-Aufrufkonvention von Drittanbietern erzeugen. Voraussetzung dafür ist, dass Sie über die Header-Datei .h für die DLL verfügen. Weiterführende Informationen finden Sie unter Generating an Import Library (Erzeugen einer Importbibliothek) in der LabWindows/CVI-Hilfe.
Um eine Importbibliothek von LabWindows/CVI aus zu nutzen, müssen Sie die Bibliothek zum Projekt hinzufügen. Wählen Sie Edit >> Add Files to Project >> Library (*.lib), um das LabWindows/CVI-Projekt um die entsprechende Importbibliothek zu ergänzen. Durch Hinzufügen der Importbibliothek wird gewährleistet, dass die DLL, für die die Importbibliothek erzeugt wurde, beim Start der Anwendung in den Speicher geladen wird. Wenn Sie die DLL nur bei Bedarf laden wollen, können Sie die Funktion LoadExternalModule verwenden, um die Importbibliothek und anschließend die DLL zu laden und den Programmcode in der DLL auszuführen. Dadurch wird sichergestellt, dass die DLL nicht automatisch beim Start der Anwendung geladen wird. So haben Sie eine genauere Kontrolle über das Laden der DLL. Weitere Informationen zur Funktion LoadExternalModule finden Sie in der Funktionshilfe von LabWindows/CVI.
Wenn Sie die Funktion LoadExternalModule nutzen, müssen Sie die Importbibliothek zusammen mit der DLL verteilen, damit Ihre Anwendung richtig arbeitet. Soll lediglich die DLL mit Ihrer Anwendung verteilt werden und die Möglichkeit zum expliziten Laden der DLL bestehen bleiben, dann informieren Sie sich dazu im Abschnitt Worin besteht der Unterschied zwischen statischem Laden und dynamischem Laden einer DLL?
Wenn Sie die Funktionen LoadLibrary oder LoadExternalModule nicht verwenden und die Importbibliothek nicht zum Projekt hinzufügen, erscheinen bei der Erstellung Ihrer Anwendung der folgenden Fehlermeldung ähnliche Meldungen für den Linker:
Undefined symbol 'DLLFunctionName@0' referenced in "file.c".
In diesem Fall ist DLLFunctionName der Name der Funktion, die Sie in Ihrer Anwendung aufzurufen versuchen. Tatsächlich ist sie aber in einer DLL implementiert.
Weitere Hinweise dazu, wie Sie eine Importbibliothek mit LabWindows/CVI nutzen können, finden Sie unter Rules for Using DLL Files (Regeln für die Verwendung von DLL-Dateien) in der LabWindows/CVI-Hilfe.
Wie kann das Windows SDK von LabWindows/CVI aus eingesetzt werden?
Sie können die Funktionen des Windows SDK in LabWindows/CVI verwenden. Sie haben die Möglichkeit, bei den Installationsoptionen für LabWindows/CVI Full Development System die Installation des kompletten Windows SDK zu wählen. Bei Auswahl dieser Option werden alle für den Aufruf der Funktionen des Windows SDK benötigten Header-Dateien und Bibliotheken installiert. Sollten Sie nicht das komplette Windows SDK installieren oder nur über das LabWindows/CVI Base Package verfügen, steht Ihnen nur ein kleiner Teil der Funktionen des Windows SDK zur Verfügung.
Ausführliche Angaben zur Verwendung einer bestimmten Funktion des Windows SDK erhalten Sie auf der Site Microsoft Developers Network (MSDN), wo Sie die erforderliche Importbibliothek .lib und die benötigte Header-Datei .h finden, die im Quellprogramm enthalten sein müssen. Standardmäßig lädt LabWindows/CVI automatisch einige der häufig verwendeten Importbibliotheken des Windows SDK. Sie müssen also nicht manuell zum Projekt hinzugefügt werden. Unter Automatic Loading of SDK Import Libraries (Automatisches Laden von SDK-Importbibliotheken) in der LabWindows/CVI-Hilfe finden Sie diese Importbibliotheken aufgelistet. Wenn Sie eine Funktion nutzen, die nicht in einer dieser automatisch ladenden Importbibliotheken enthalten ist, wählen Sie Edit >> Add Files to Project >> Library (*.lib), so dass Sie die entsprechende Importbibliothek manuell zum LabWindows/CVI-Projekt hinzufügen können.
Weiterführender Link:
MSDN-Startseite
Wie können in Visual C++ erstellte DLLs mit LabWindows/CVI genutzt werden?
Wenn Sie eine DLL mithilfe von Visual C++ für die Verwendung mit LabWindows/CVI erstellen, müssen Sie die exportierten Funktionen als extern "C" kennzeichnen, um festzulegen, dass diese Funktionen mit einem C-Compiler benutzt werden. Wird eine exportierte Funktion nicht als extern "C" gekennzeichnet, ist LabWindows/CVI nicht in der Lage, diese Funktion aufzurufen, weil C++-Compiler Funktionsnamen verstümmeln, wenn sie von einer DLL exportiert werden. Der folgende Programmcode ist ein Beispiel dafür, wie die Funktion in Visual C++ bezeichnet werden kann, um die C-Verknüpfung anzugeben und zu bestimmen, dass diese Funktion exportiert werden soll.
extern "C" char __declspec(dllexport) GetChar( void )
Nähere Informationen über die Anweisung extern "C” finden Sie in der Dokumentation für Visual C++.
Tipp: Wenn Sie der Ansicht sind, dass die falschen Funktionsnamen von einer DLL exportiert werden, können Sie das kostenlose Werkzeug "Dependency Walker" benutzen, um die Funktionsnamen, die gerade exportiert werden, anzusehen. Sie können dieses Werkzeug zur Anzeige der exportierten Funktionsnamen und aller Abhängigkeiten Ihrer DLL nutzen. Wie Sie dieses Werkzeug herunterladen, erfahren Sie unter Weiterführende Links. Ein Hinweis darauf, dass ein Funktionsname verstümmelt ist, sind Zeichen wie „@“ und „?“ als Teil des Namens. So ist beispielsweise die Funktion FPi_i@@YAHPAH@Z eine verstümmelte Version der Funktion FPi_i(int *a).
Weiterführende Links:
MSDN: Linkage to Non-C++ Functions
Dependency Walker
Weitere Informationen zu DLLs in Windows
Das Microsoft Developers Network (MSDN) liefert Informationen zu DLLs auf Windows-Systemen. Unter folgendem Link erfahren Sie mehr über DLLs:
MSDN: About Dynamic-Link Libraries
Links auf thematisch verwandte Internetseiten:
Wie werden Variablen und Funktionen aus einer DLL in LabWindows/CVI exportiert? (engl.)
Wie kann ich auf DLL-Funktionen in einem LabWindows/CVI-Programm zugreifen, ohne die Importbibliothek in das Projekt einzubeziehen? (engl.)
Wie erstelle ich eine CVI-DLL, die eine Datei mit Benutzeroberfläche enthält und setze die DLL in Visual C++ ein? (engl.)
<< Hauptseite NI LabWindows/CVI
AGB
Dieses Tutorium ("Tutorium") wurde von National Instruments ("NI") entwickelt. Auch wenn National Instruments dieses Tutorium technisch unterstützt, ist es jedoch möglich, dass dieses Tutorium nicht umfassend getestet und überprüft wurde. NI übernimmt weder Garantien bezüglich der Qualität des Tutoriums noch bezüglich der weiteren technischen Unterstützung neuer Versionen ähnlicher Produkte und Treiber. DIESES TUTORIUM WIRD IM "IST-ZUSTAND" ZUR VERFÜGUNG GESTELLT UND NI ÜBERNIMMT KEINERLEI GARANTIEN. AUSFÜHRLICHERE ERLÄUTERUNGEN ZU ANDEREN EINSCHRÄNKUNGEN ENTNEHMEN SIE BITTE DEN NUTZUNGSBEDINGUNGEN AUF NI.COM (http://ni.com/legal/termsofuse/unitedstates/us/).
