2009-07-20 14 views
3

Je travaille sur l'encapsulation d'un grand nombre de fichiers .h et .lib de C++ natif en C++ managé pour une utilisation éventuelle en tant que .dll référencé en C#.void * à Object^en C++/CLI

Certaines des fonctions C++ natives ont un type de retour de void *. Je ne sais pas comment gérer cela lorsque je renvoie la valeur à mon code d'appel. Par exemple: si une application C# appelle mon emballage dll, qu'est-ce que je reviens de l'appel natif:

void* start(ThreadFunc,void *, unsigned *); 

Je tente actuellement de boîte le retour dans un système générique :: Object^sans chance. C'est l'appel dans l'emballage:

m_NativeThread->start(cb, 
     GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(), 
     static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer()))); 

Quelqu'un peut-il offrir une solution?

Répondre

0

Pouvez-vous en faire un IntPtr? Que voulez-vous que le client fasse avec le vide *?

+0

Je ne sais pas ce qu'ils feraient avec le vide * honnêtement. Je suppose que cela aiderait si je savais pourquoi il est déclaré avec un vide * dans le premier pla ... Quel est le but d'un vide *? Pourquoi/Quand l'utiliserais-je? – TomO

+0

Un pointeur vide est un pointeur vers un type inconnu, semblable à une référence à System.Object dans .NET, mais sans les informations de type d'exécution associées (c'est-à-dire que vous ne pouvez pas interroger la référence pour son type). J'ai mal posé ma question, je voulais vraiment dire: "A quoi la fonction start() s'attend-elle à ce que vous utilisiez sa valeur de retour?" Parce que s'il n'est jamais utilisé, vous pouvez simplement le jeter. S'il est utilisé comme un handle pour, par exemple, terminant le fil, je l'exposerais comme un IntPtr. –

4

Si votre code managé a besoin de voir les données dans le vide *:

Vous ne pouvez pas lancer un vide * à mémoire non géré à une référence d'objet géré. Pour activer cela dans la mémoire gérée, vous devez utiliser Marshal.Copy() ou Marshal.PtrToStructure(). Cette volonté de bien sûr ne fonctionne que si vous connaissez le type des données vers lesquelles le point d'exclamation * pointe. source

Si votre code managé n'a pas besoin de voir les données dans le vide *:

magasin dans un IntPtr si votre code managé n'a pas besoin de voir ce qu'il est et le renvoie simplement dans le code non géré plus tard. source