Hallo alle zusammen, ich habe folgende Problem: Ich habe einen CWrapper geschrieben. Ursprüngliche Code war C++ (VS2008) --> in eine CCode gewrappert. Als ich mit dem C_DLL_Wrapper fertig war, wollte ich die Ergebnis(DLL+dazu gehörige Header File) mit Labview importieren. Ich bekomme leider folgende Fehlermeldung:"Diese Anwendung konnte nicht gestartet werden, da die Side-by-Side-Konfiguration ungültig ist" Da ich in Labview gan am Anfang bin, weiss ich nicht woran es liegen kann. Diese Fehlermeldung bekomme ich bei alle Funktionen. hat jemenden eine Idee woran es liegen kann ? Danke in Voraus
Die DLL ist wohl keine C- bzw. C++-DLL, sondern eine .Net-DLL, die Du mit "C++/CLI" bzw. "Managed C++" geschrieben hast. Dazu jedenfalls passt die Fehlermeldung. Überprüfe also die Projekteinstellungen; ärgerlicherweise ist der mit Visual C++ gelieferte Compiler auch ein .Net-Compiler und ärgerlicherweise nennt MS ihre .Net-Variante irreführenderweise "C++", so daß man da durchaus drauf reinfallen kann.
in Labview bei Funktion Aufruf. Was ist der Unterschied "Calling Convention" zwischen stdcall(WINAPI) und C
Markus schrieb: > Was ist der Unterschied "Calling Convention" zwischen stdcall(WINAPI) > und C Das beschreibt, wer den Stack aufräumt, der Aufrufer (Caller) oder der Aufgerufene (Callee). C-Konvention (auch als "cdecl" bezeichnet) besagt, daß der Aufrufer den Stack aufräumt, womit auch Funktionsaufrufe mit variabler Argumentenliste möglich sind. Das ist in C- und C++-Programmen der Standard. In stdcall-Konvention (auch als "Pascal"-Aufrufkonvention bezeichnet) räumt der Aufgerufene den Stack auf. Das ist der Standard für den Aufruf von Win32-API-Funktionen. Siehe auch http://msdn.microsoft.com/de-de/library/zkwh89ks.aspx und http://msdn.microsoft.com/de-de/library/zxk0tw93.aspx
Hallo, bei meinen Library import bekomme ich folgende Fehlermeldung sehe Anhang: Mir ist nicht ganz klar woran es liegen kann?
hallo alle zusammen, ich habe folgende versucht: Mit Hilfe dieses link "http://labviewwiki.org/DLL/shared_library", einen DLL von C++ zu erstellen und dann dieses DLL in Labview zu importieren. Die normale Klasse "Header File"
1 | #ifndef _BASE_CLASS_H_
|
2 | #define _BASE_CLASS_H_
|
3 | |
4 | class base |
5 | {
|
6 | public:
|
7 | base(double x_in); |
8 | virtual ~base(void); |
9 | void set_x(double x_in); |
10 | void get_x(double* x_out); |
11 | void sqr_x(void); |
12 | |
13 | private:
|
14 | double x; |
15 | };
|
Cpp File:
1 | #include "base_class.h" |
2 | #include <windows.h> |
3 | |
4 | base::base(double x_in) |
5 | {
|
6 | x = x_in; |
7 | }
|
8 | |
9 | base::~base () |
10 | {
|
11 | /* clean up */
|
12 | }
|
13 | |
14 | void base::set_x(double x_in) |
15 | {
|
16 | x = x_in; |
17 | }
|
18 | |
19 | void base::get_x(double* x_out) |
20 | {
|
21 | *x_out = x; |
22 | }
|
23 | |
24 | void base::sqr_x(void) |
25 | {
|
26 | x*=x; |
27 | }
|
c_DLL_Wrapper Header File:
1 | #ifndef _C_DLL_WRAPPER_H_
|
2 | #define _C_DLL_WRAPPER_H_
|
3 | |
4 | /* building a DLL */
|
5 | #define DLLIMPORT __declspec (dllexport)
|
6 | |
7 | #ifdef __cplusplus
|
8 | extern "C" { /* using a C++ compiler */ |
9 | #endif
|
10 | |
11 | typedef struct base base; /* make the class opaque to the wrapper */ |
12 | |
13 | DLLIMPORT base* create_base(double x_in); |
14 | DLLIMPORT void set_x(base* LV_ref, double x_in); |
15 | DLLIMPORT void get_x(base* LV_ref, double* x_out); |
16 | DLLIMPORT void destroy_base(base* LV_ref); |
17 | DLLIMPORT void sqr_x(base* LV_ref); |
18 | |
19 | #ifdef __cplusplus
|
20 | }
|
21 | #endif
|
22 | |
23 | |
24 | #endif /* _C_DLL_WRAPPER_H_ */ |
25 | |
26 | |
27 | #endif /* _BASE_CLASS_H_ */ |
CPP File der C_DLL_Wrapper
1 | #include "c_dll_wrapper.h" |
2 | #include "base_class.h" |
3 | #include <windows.h> |
4 | |
5 | DLLIMPORT base* create_base(double x_in) |
6 | {
|
7 | return new base(x_in); |
8 | }
|
9 | |
10 | DLLIMPORT void set_x(base* LV_ref, double x_in) |
11 | {
|
12 | LV_ref->set_x(x_in); |
13 | }
|
14 | |
15 | DLLIMPORT void get_x(base* LV_ref, double* x_out) |
16 | {
|
17 | LV_ref->get_x(x_out); |
18 | }
|
19 | |
20 | DLLIMPORT void destroy_base(base* LV_ref) |
21 | {
|
22 | delete LV_ref; |
23 | }
|
24 | |
25 | DLLIMPORT void sqr_x(base* LV_ref) |
26 | {
|
27 | LV_ref->sqr_x(); |
28 | }
|
Das DLL konnte es erstellt werden. Nur beim Importieren von der DLL File in Labview bekomme ich folgende Fehlermeldung(seh bitte Anhang). Das Importieren an sich ist kein Problem und ich konnte auch alle Methode exportieren.Problem tritt bei Ausführung eine der Funktion.
Das sieht so aus, als wenn lv mit dem void als Rückgabe nicht klar kommt. Versuch doch mal int. Du musst den ja nicht auswerten.
Hallo, wenn ich ich meine Rückdaten Type zu double ändere dann bekomme ich auch das gleiche Fehler wie es oben steht. Was für Problem hatte er mit dem Cluster LV_ref out . Ich verstehe das nicht wie ich das aufheben soll? Was mache ich denn falsch? gibt jemenden, der mit DLL import sich auskennt?
/Meckermodus an Labview meckert über das Frontpannel, du zeigst das Blockdiagramm merkste wat? Labview sagt dir das nicht alle Terminals vom DLL Import angeschlossen sind ändere das Du versuchst verzweifelt den Zeiger auf deine Klasse in Labview zu verarbeiten, wieso? Labview kann damit nichts anfangen! Kapsel den Zeiger in deiner DLL! Du gibst einen Zeiger zurück ohne überprüft zu haben ob der gültig ist. Du verschweigst uns mit welcher Version von Labview und mit welcher IDE/Compiler du deine DLL erzeugst. Du nennst deinen Define DLLIMPORT es ist aber ein DLLEXPORT, es ist keine Schande richtige Bezeichnungen zu wählen. /Meckermodus aus Fange doch mal klein an, baue eine einfache DLL die nur eine Funktion exportiert, so zum Beispiel: header __declspec (dllexport) int dll_func(int para_hin, int* para_rueck); cpp __declspec (dllexport) int dll_func(int para_hin, int* para_rueck) { *para_rueck = para_hin+1; return 0; } In Labview benötigst du hierfür nur signed 16 bit Datentypen. Wenn das funktioniert geht es weiter. Wichtig ist auch wie du das DLLImport VI konfiguriert hast. Mache einen Screenshot davon, das hilft bei der Fehlersuche.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.