(06.03.2014 09:38 )galilio schrieb: Noch eine Frage Bitte:
Beim DLL erstellung:
spielt eine Rolle, ob der DLL von eine Release Version oder Debug Version ist?
Solange Du die DLL nur auf dem Entwickelsystem ausführen willst, auf dem Du auch den C Compiler installiert hast nicht. Aber wenn Du das auf einem anderen Rechner auch testen willst kommst Du legal nur mit einer Release DLL weiter. Die Debug DLL linkt mit einer speziellen Version der C Runtime. Für diese hast Du zumindest bei Visual C keinerlei Rechte diese zu distributieren oder auch nur auf einem anderne Rechner zu installieren, ohne dort auch eine lizenzierte Visual C Installation zu machen.
Was die anderen Probleme betrifft, begreife ich eigentlich nur
. So wie sich das mir darstellt, ist das Problem nicht so sehr dass Du LabVIEW nicht begreifst, sonderen eigentlich auch wenig Ahnung hast wie man überhaupt C++ Code aus jeder beliebigen nicht C++ Umgebung aufrufen sollte.
LabVIEW kann nur globale Funktionen aus einer DLL importieren, keine Objektmethoden. (Und nicht nur LabVIEW! C++ Objektcode kann grundsätzlich nur in ein Projekt gelinkt werden dass mit dem gleichen C++ Compiler compiliert wird, wie die Bibliothek selber, teilweise geht es sogar schon verkehrt bei unterschiedlichen Versionen des selben Compilers. Selbst wenn Du eine C++ DLL machst würdest Du ziemlich sicher gewaltig auf die Schnauze fallen, wenn Du diese DLL in einem Projekt verwenden möchtest, das mit einem anderen Compiler erzeugt wird dann die DLL selber. Es gibt nämlich keinerlei Binärstandard für C++ Bibliotheken und wenn es ihn gäbe würde sich keiner der Compilerhersteller 100% daran halten.)
In Deinem Beispiel solltest Du wohl am besten den Code so aufteilen:
MyClass.cpp ist die Implementation Deiner Klasse. Was Du darin haben willst ist wirklich Deine Sache, respektive hat Deine DLL ja hoffentlich schon (natürlich heisst das da nicht MyClass!!).
Code:
#include "StdAfx.h"
#include "MyClass.h"
MyClass::MyClass(int par)
{
// ??
Ja das ist Dein Objekt!!! Was Du da im Konstruktor haben musst ist Deine Sache!
}
MyClass::~MyClass(void)
{
//??
Dasselbe in grün
}
==> Irgendwo müsste auch noch die Implementation von
int MyClass:: Methode1(int par)
{
// ??
return something;
}
int MyClass::Methode2(int par1, double par2)
{
// ??
return something;
}
Nun kommt der Wrapper z.B. in file MyClassWrap.cpp
Code:
#include "MyClass.h"
extern "C" __declspec(dllexport) MyClass* createMyClass(int par)
{
return new MyClass(par);
}
extern "C" __declspec(dllexport) void destroyMyClass(MyClass* ref)
{
delete ref;
}
extern "C" __declspec(dllexport) int MyClass_Methode1(MyClass* ref, int par)
{
return ref->Methode1(par);
}
extern "C" __declspec(dllexport) int MyClass_Methode2(MyClass* ref, int par1, double par2)
{
return ref->Methode2(par1, par2);
}
In LabVIEW kannst Du nun mit der Call Library Node folgende Funktionen einlinken:
void* createMyClass(int);
void destroyMyClass(void*);
int MyClass_Methode1(void*, int);
int MyClass_Methode2(void*, int, double);
Wenn das noch nicht deutlich ist kann ich auch nicht mehr helfen.