Zgodnie z obietnicą podaje przykład, może się komuś przyda.
Załóżmy, że mamy do dyspozycji klasę punkt zdefiniowaną w pliku
punkt.h
o takiej budowie:
Kod: Zaznacz cały
class punkt
{
public:
punkt(int,int); //konstruktor
virtual ~punkt(); //destruktor
void przesun(int,int); //funkcja przesuwająca punkt x,y o zadaną wartość
void pokaz(int*,int*); //wyświetla aktualne wartości x,y
private:
int x,y; //współrzędne punktu x,y
};
oraz plik
punkt.cpp :
Kod: Zaznacz cały
#include "punkt.h"
#include <windows.h>
punkt::punkt(int a, int b)
{
x=a;
y=b;
}
punkt::~punkt()
{
//destruktor
}
void punkt::przesun(int a, int b)
{
x+=a;
y+=b;
}
void punkt::pokaz(int* a,int* b)
{
*a=x;
*b=y;
}
Załóżmy, że chcemy skorzystać sobie z klas napisanych w C++ i utworzyć plik dll do wywoływania różnych funkcji danej klasy w LabVIEW. Jak wiadomo w LV można wywoływać jedynie DLL napisane w czystym C, zatem należy utworzyć opakowanie (wrapper), które "przetłumaczy" klasę w C++ na zwykłe wywołania funkcji w C. Dokładniej oznacza to, że musimy napisać jakiś kod w C, który LabVIEW zrozumie i pośrednio wywoła żądaną klasę w C ++.
Aby tego dokonać należy napisać specjalne opakowanie (wrapper). Jak wiadomo w C++ struktura jest klasą, zatem podczas deklarowania w nagłówku wrappera można napisać coś takiego:
powodując tym samym, że klasa będzie nieprzezroczysta dla naszego wrappera.
Następnie tworzymy funkcje, które będziemy chcieli sobie wywoływać w LabVIEW, a przed całością dajemy specyfikator extern "C" . Przykładowo nagłówek takiego wrappera może wyglądać tak:
Kod: Zaznacz cały
]#ifndef _DLL_H_
#define _DLL_H_
#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */
#ifdef __cplusplus
extern "C" { /* using a C++ compiler */
#endif
typedef struct punkt punkt; /* sprawia, że klasa jest nieprzezroczysta dla wrappera */
DLLIMPORT punkt* konstruktor(int a, int b);
DLLIMPORT void przesun_xy(punkt* LV_ref, int a, int b);
DLLIMPORT void pokaz_xy(punkt* LV_ref, int* a, int* b);
DLLIMPORT void destruktor(punkt* LV_ref);
#ifdef __cplusplus
}
#endif
#endif /* _DLL_H_ */
Zaś same funkcje w pliku głównym:
Kod: Zaznacz cały
DLLIMPORT punkt* konstruktor(int a, int b)
{
return new punkt(a,b);
}
DLLIMPORT void przesun_xy(punkt* LV_ref, int a, int b)
{
LV_ref->przesun(a,b);
}
DLLIMPORT void pokaz_xy(punkt* LV_ref, int* a, int* b)
{
LV_ref->pokaz(a,b);
}
DLLIMPORT void destruktor(punkt* LV_ref)
{
delete LV_ref;
}
Mając wykonany taki dll możemy zabrać się za wstawienie go do LabVIEW, przykład obrazu w załączniku.
Ogólnie polecam przeczytanie strony co wcześniej została podana i jeszcze tej:
http://forums.devx.com/showthread.php?t=170263
Tekst pisałem i tłumaczyłem na szybko więc może mieć trochę błędów.
W załączniku wrzucam przykład takiej biblioteki dll -> punkt.dll
nagłówek wrappera dll.h
plik wrappera dllmain.cpp
nagłówek klasy punkt.h
plik klasy punkt.cpp
oraz przykładowe vi, które korzysta z napisanego dlla -> punkt.vi