2010-09-05 7 views
2

Im utilisant P/invoke sur une fonction dll non managée swe_get_planet_name() en C#. La définition de fonction donnée est,pInvoke C# Problème d'importation DLL

char* swe_get_planet_name(int ipl, char *spname); 

Cela signifie que la valeur de retour est affecté à char * spname? Il semble que ce soit à partir de l'exemple de code dans la documentation.

char snam[40];   
/* 
* get the name of the planet p 
*/ 
swe_get_planet_name(p, snam); 
/* 
* print 
*/ 
printf(snam); 


Donc, mon code C# est

[DllImport("swedll32.dll")] 
     private static extern void swe_get_planet_name(int ipl, char[] spname); 

char[] name = new char[40]; 
int p = 3; 
swe_get_planet_name(p, name); 

Cette exécute sans erreur, mais 'nom' variable est attribué un sens '\ 0' dans chaque élément au lieu du nom de la planète que c'est censé revenir. Rien de mal avec la DLL puisque l'application d'exemple fourni par le fournisseur fonctionne correctement. Des idées?

+0

Avez-vous essayé de passer dans un pointeur sur un tableau d'octets plutôt que sur char []? Ce sera organisé différemment, je crois. –

Répondre

4

Il semble une interface C très faible et dangereuse, sans qu'un paramètre de taille ne soit passé.

Le motif normal ici est de fournir un Stringbuilder pour recevoir le texte, et laisser le marshaleur faire sa magie.

[DllImport("swedll32.dll")] 
private static extern void swe_get_planet_name(int ipl, StringBuilder spname); 

//char[] name = new char[40]; 
StringBuilder name1 = new StringBuilder(40); // the 40 may be usefuul, not sure 
int p = 3; 
swe_get_planet_name(p, name1); 
string name = name1.ToString(); 
+0

Je suis d'accord c'est une mauvaise interface mais je ne pense pas qu'il peut le changer .... –

+2

Il est préférable de déclarer le type de retour comme IntPtr, puisque la fonction d'origine renvoie le pointeur. –

+1

Merci beaucoup les gars. La solution StringBuilder fonctionne! –

Questions connexes