Forum: PC-Programmierung Labview Fehlermeldung beim Importieren von DLL


von Markus (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Dietmar (Gast)


Lesenswert?


von Markus (Gast)


Lesenswert?

in Labview bei Funktion Aufruf.
Was ist der Unterschied "Calling Convention" zwischen stdcall(WINAPI) 
und C

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
bei meinen Library import bekomme ich folgende Fehlermeldung sehe 
Anhang:


Mir ist nicht ganz klar woran es liegen kann?

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Dietmar (Gast)


Lesenswert?

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.

von Markus (Gast)


Lesenswert?

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?

von Dietmar (Gast)


Lesenswert?

/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
Noch kein Account? Hier anmelden.