Mr Burns Skrevet 3. mars 2007 Del Skrevet 3. mars 2007 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
GeirGrusom Skrevet 3. mars 2007 Del Skrevet 3. mars 2007 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 Lenke til kommentar
Mr Burns Skrevet 3. mars 2007 Forfatter Del Skrevet 3. mars 2007 Spørs, hvis dette er en C++ klasse, må du nok skrive et program i C++.NETmen 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
GeirGrusom Skrevet 3. mars 2007 Del Skrevet 3. mars 2007 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
Mr Burns Skrevet 4. mars 2007 Forfatter Del Skrevet 4. mars 2007 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
GeirGrusom Skrevet 4. mars 2007 Del Skrevet 4. mars 2007 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
Mr Burns Skrevet 4. mars 2007 Forfatter Del Skrevet 4. mars 2007 (endret) 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 Endret 4. mars 2007 av Mr Burns Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå