p/invoke C une fonction qui retourne le pointeur sur une struct
Comment dois-je déclarer en C# une fonction C qui retourne un pointeur vers une structure?
Je crois que la suite est une façon de faire qui, suivi par Maréchal.PtrToStructure pour obtenir réelle de la valeur de la structure.
//C-function
SimpleStruct * Function(void);
//C# import
[DllImport("MyDll.dll")]
public static extern IntPtr Function();
- Suis-je la corriger?
- Il existe d'autres moyens pour faire de même? (Il serait OK pour que la structure arrière de la valeur)
OriginalL'auteur THX-1138 | 2009-04-22
Vous devez vous connecter pour publier un commentaire.
Étant donné que la fonction retourne un pointeur (j'espère ne pas en local alloué?) votre meilleur pari est de manuellement maréchal (via Maréchal.PtrToStructure).
Si il s'agissait d'un paramètre, vous pouvez créer une version gérée de la structure à l'aide de la PInvoke Interop Adjoint de le passer via ref ou à l'extérieur.
Je crois que vous vous trompez. Il y a un certain nombre de grandes classes de problèmes d'interopérabilité qui nécessitent manuel de l'assemblage de pointeurs. De taille Variable des structures et des structures contenant des tableaux de structures ne sont que deux des plus communs.
J'ai mis un exemple de gérer une structure contenant un tableau de struct arnshea.blogspot.com/2009/04/... . C'est assez rare que vous avez manuellement le maréchal de données pour l'interopérabilité...
que faire si j'ai une fonction qui retourne un pointeur vers une struct alloués localement?
J'ai vu beaucoup de bibliothèques de travailler dans ce sens. Vous avez une "créer" de la fonction qui vous donne la poignée ou struct et après vous avez terminé avec cela que vous appelez "gratuit" en fonction de l'avoir détruit.
OriginalL'auteur Arnshea
Mise en garde: cela ne fonctionne que si le pointeur retourné est la mémoire déjà géré par le CLR
Je crois que ce que vous cherchez est
Cela devrait éliminer la nécessité pour n'importe quel manuel de
Marshal.PtrToStructure
appels. Selon ce que votre structure contient, vous pouvez avoir besoin de marquer des champs avecMarshalAs
attributs appropriés. MSDN a un bon exemple de cela.MarshalAs(LPStruct) la plupart décrit exactement ce que je veux. Si LPStruct sur le retour de P/Invoke incompatibles: "Impossible de maréchal de "valeur de retour": les Invalides réussi/non géré type de combinaison ..."
J'ai fait un peu d'essais, et c'est un struct mobilisé comme
LPStruct
qui ne fonctionne pas - je vais éditer le post de manière appropriée. En outre, il est un de plus (assez importante) mise en garde: La mémoire pointé (le SimpleStruct* dans le code C) doit avoir été alloués par le CLR, car elle ajoute une référence à elle et va essayer de collecter les ordures. Je vais ajouter ceci à la poste en tant que bien. Donc, il semble que vous devez aller avec la IntPtr approche.OriginalL'auteur Eric Burnett
Je ne suis pas un expert du tout, mais il m'est arrivé de regarder un morceau de code (que je ne comprends pas complètement, vous l'esprit) qui est en train de faire la même chose.
Ici est ce qu'ils font
puis sur la structure, ils ont l'attribut suivant
Je pense que la pièce que vous cherchez, c'est la [In,Out] de la partie, et depuis il est transmis via ref, vous devriez obtenir les mêmes données.
marqué comme wiki de la communauté afin que les gens peuvent résoudre ce si mal.
OriginalL'auteur