C# et Dll C++

Résolu
rbonnal Messages postés 19 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 21 mars 2008 - 24 mai 2007 à 18:26
rbonnal Messages postés 19 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 21 mars 2008 - 25 mai 2007 à 12:03
Bonjour a tous !<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??> 


Je répète que suis aussi fort en C# que Sarko en roller !!!


J’ai un problème assez embêtant. J’importe une DLL C++ en C# de la manière suivante :

[DllImport("DocFileATL.dll")]
        publicunsafestaticexternint GetInfo(int* FileNum, char* PVers, int* FPSign);
     


Je fait appel a la fonction de cette façon : 
 

unsafe
      {




     
     
char* PVers = null;


            GetInfo(&FileNum, PVers, & FPSign); 


       }







La il me met "invalid ptr" coté CPP (même si je lui affecte une valeur avant le CPP).


La fonction GetInfo modifi tous les arguments, ca marche sur les 2 int mais pas sur le char *. A la base je n’avais pas de char * mais une string, ca n’a pas marcher non plus. J’ai aussi essayer [MarshalAs(UnmanagedType.LPTStr)] string





Pour le type de PVers.



Est-ce que quelqu’un connais un tuto ou connais la façon de faire pour que ca marche.

4 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
24 mai 2007 à 19:16
Salut, attention 'char' fait 2 octets en C# et 1 en C++, utilise sbyte* ou IntPtr ou un StringBuilder avec une taille pré-initialisé.
3
ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
24 mai 2007 à 22:22
salut,

tu as l'attributs MarshalAs pour spécifier le type de marshalling...http://www.sharevb.net/Les-API-en-VB-Net.html

ShareVB
3
rbonnal Messages postés 19 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 21 mars 2008
25 mai 2007 à 11:52
Merci beaucoup de votre aide, il fallait en fait utiliser le stringbuilder et le marshalling comme cela :







[


DllImport("DocFileATL.dll")]
        publicunsafestaticexternint GetInfo(
int
* FileNumParam,





[

MarshalAs

(

UnmanagedType

.LPWStr)]

StringBuilder



PVersParam, int* FPSignParam);<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>





















et ensuite :






 







FileNum = 0;




FPSign = 0;




StringBuilder





PVers





=

new


StringBuilder



();




 






unsafe
{








   GetInfo(&FileNum, PVers, & FPSign); 



         }








 




Dans la déclaration j’ai changer les noms de xxx en xxxParam car c’est plus correct mais c’est pareil de tout façon.




Merci Encore !
0
rbonnal Messages postés 19 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 21 mars 2008
25 mai 2007 à 12:03
Pardon pour le publicunsafestaticexternint,
c'est public unsafe static extern int....
0
Rejoignez-nous