C# et Dll C++

Résolu
Signaler
Messages postés
19
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
21 mars 2008
-
Messages postés
19
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
21 mars 2008
-
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

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

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

ShareVB
Messages postés
19
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
21 mars 2008

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 !
Messages postés
19
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
21 mars 2008

Pardon pour le publicunsafestaticexternint,
c'est public unsafe static extern int....