2009-05-06 7 views
2

J'ai une DLL C++ renvoyant un int* à un programme C#. Le problème est le int* dans C# reste null après l'affectation.Convertir IntPtr en int * en C#?

Lorsque j'attribue le résultat C++ à un IntPtr, j'obtiens une valeur non nulle correcte. Cependant, toute tentative de conversion en int* donne null.

J'ai essayé:

IntPtr intp = cppFunction();   // Non-null. 

int* pi = (int *) intp;     // Results in null. 

int* pi = (int *) intp.ToPointer(); // Results in null. 


void* vp = intp.ToPointer(); 

int* pi = (int *) vp;     // Results in null, but vp is non-null. 

Comment puis-je obtenir un int* non nul?

Merci! Alan

+0

J'ai utilisé la fonction malloc() standard de msvcrt.dll comme "cppFunction()". Cela a bien fonctionné pour moi, je pouvais même lire/écrire l'emplacement de la mémoire allouée. Lorsque j'ai affecté un nombre aléatoire à intp (IntPtr intp = (IntPtr) 1000;), j'ai reçu une exception NullPointerException uniquement lors de la déréférence. Pourtant, la valeur du pointeur n'a jamais été nulle ... Pouvez-vous me donner un petit programme complet qui produit des résultats incorrects? – Hali

+0

avez-vous la possibilité de refactoriser le C++ afin que vous puissiez transmettre un IntPtr avec la mémoire requise allouée? il serait mieux de cette façon - ou connecter un rappel pour allouer la mémoire en C# selon http://stackoverflow.com/questions/9378626/how-can-i-return-a-stringbuilder-or-other-string- tampon-de-un-pinvoke-native-ca – dice

Répondre

4

déclaration Vous cppFunction devrait être quelque chose comme:

void cppFunction(ref int* ptr) { 
    ptr = somevalue; 
} 

Cela devrait résoudre votre problème.

Vous pouvez trouver ce utile aussi: http://www.pcreview.co.uk/forums/thread-2902012.php

+0

Merci James. J'ai essayé votre méthode comme ceci: [DllImport ("vdrdll.dll", EntryPoint = @ "? GetLineContentsAsArg @@ YAXAAPAH @ Z")] public dangereux safe externe getLineContentsAsArg (ref int * lca); dllexport vide getLineContentsAsArg (int * et Ica) { \t = lca calculateLineContents(); } Une valeur de pointeur est affectée dans la DLL, mais lorsqu'elle revient en C#, elle est nulle. J'ai regardé vos exemples, et seul le dernier essaie d'assigner une variable pointeur en C#. Chaque fois que j'ai essayé cela, le résultat de l'assignation est nul. Pouvez-vous voir quelque chose que je fais mal? Merci! – user20493

+0

Je devrai regarder plus quand je finis tondre, mais, j'ai réalisé que récemment la façon dont j'ai résolu ceci était qu'en C# j'ai alloué un tampon, envoyé le pointeur au code non managé, avec un IntPtr pour obtenir la longueur . Le problème que vous rencontrez est probablement dû au fait que vous attendez que la fonction C++ fasse le malloc et renvoie la chaîne. Dans ce cas, vous devrez probablement passer un pointeur vers le pointeur, mais je ne suis pas certain de savoir comment le libérer en C# quand vous en aurez fini avec lui. –

Questions connexes