Gå til innhold

C#: Hvordan importere klasser fra unmanaged DLL?


Anbefalte innlegg

Heisann!

 

Jeg klarer fint å importer og kalle funksjoner fra en unmanaged DLL, men en av funksjonene returnerer en klasse. Har jeg noen mulighet for bruke den (relativt) direkte, eller må jeg skrive en ny managed DLL for å håndtere denne? Eller noe helt annet?

Lenke til kommentar
Videoannonse
Annonse
Spørs, hvis dette er en C++ klasse, må du nok skrive et program i C++.NET

men hvis dette er en COM klasse, kan du bruke System.Runtime.Interop

8068250[/snapback]

La oss anta at den ikke er COM...

 

Da blir jobben omtrent:

 

- Lage en managed dll i c++, som kaller opp den dllen som er unmanaged

- Importere min dll.

Lenke til kommentar

Ja, man kaller dette en wrapper.

C++ klasser er ganske spesielle, siden C++ støtter multiple inheritance, noe ingen andre språk gjør, og C++ i windows bruker noe som kalles decorated functions, dv.s at funksjonsnavnet forteller alt om hver funksjon i en dll, og derfor ser de ganske merkverdige ut hvis du kikker på dem

??IndexOf@@3?? e.l. (dette er bare tilfeldig laget av meg)

Lenke til kommentar

Jeg har .h-fila til .dllen jeg skal bruke, der står det blant annet:

 typedef void TAjatDICControl;
typedef void * TDICLibCallback;

extern "C" {
__declspec(dllexport) bool  __cdecl DICLoadLibrary(void);
__declspec(dllexport) bool  __cdecl DICReleaseLibrary(void);
__declspec(dllexport)  __cdecl typedef void TAjatDICControl;

__declspec(dllexport) TAjatDICControl *  __cdecl DICOpenDevice(char *dataPath,
                                                              char *grabber=NULL,
                                                              char *paramStr=NULL,
                                                              char *calibrationFile=NULL);
__declspec(dllexport) bool  __cdecl DICCloseDevice(TAjatDICControl *ctrl);


__declspec (dllexport) bool  __cdecl DICStart(TAjatDICControl *ctrl,
                                             int frameCount,bool wait);
__declspec (dllexport) bool  __cdecl DICStop(TAjatDICControl *ctrl);

 

Problemet mitt er de funksjonene som returnerer TAjatDICControl. Strengt tatt er det vel en peker til TAjatDICControl. Jeg vet ikke helt hvordan jeg skal håndtere den. Jeg antar at TAjatDICControl er en klasse definert i DLLen, den er og typedef som nummer tre etter "extern C", kan det brukes på ett vis?

Lenke til kommentar

Hmm, den er litt kødden

For det første synes jeg det er ganske tåpelig å deklarere noe som void,

for deretter å bruke det som en void *

Du må nesten se (eller vise meg) hva DICOpenDevice(char *dataPath, char *grabber=NULL, char *paramStr=NULL, char *calibrationFile=NULL);

gjør for noe.

Det ser ut som om du kan bruke strukturer i C# for å få dette til å fungere.

Lenke til kommentar

DICOpenDevice gir meg et TAjatDICControl-objekt/klasse i retur. Samtidig setter DLLen opp en virtuell comport som brukes til å kommunisere med detektoren gjennom et framegrabber-kort. All kommunikasjon blir gjort av dllen, ev. i klassen TAjatDICControl. For å få et bilde fra detektoren må jeg gjøre omtrent:

 

DICLoadLibrary();

TAjatDICControl *ctr = DICOpenDevice(...);

 

DICStart(ctr, ...);

<en struct for bilde> = DICGetCurrentImage(ctr,...);

DICCloseDevice(ctr);

DICReleaseLibrary();

 

Så er det bare å lagre bildet...

 

Forøvrig fikk jeg det til ved å gå en omvei. C#-programmet skal ta 16 bilder. Jeg lagde en c++ exe som tar ett bilde og lagrer det, og sjekker om fila eksisterer. C#-programmet venter på at en bildefil skal finnes på disken. Når den finnes blir den renamet. C++-programmet kan da ta et nytt bilde...

 

Ikke særlig elegant, men det fungerte :thumbup:

Endret av Mr Burns
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...