Probleme de marshaling

Résolu
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 - 21 déc. 2006 à 11:18
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 21 déc. 2006 à 14:10
Salut,

Je dois appeler une fonction qui se trouve dans un Dll écrite en C++.
Cette fonction prend en entrée des chaine de type wchar_t*.

Le probleme est que quand j'appel la fonction, la Dll reçoit des chaines vides.

Voici le proto de ma fonction en C#

extern public static void GetProcessEnvVar(long ProcessPID, [MarshalAs(UnmanagedType.LPWStr)] string VarName, [Out, MarshalAs(UnmanagedType.LPWStr)]  string VarVal);

D@runia

10 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 déc. 2006 à 13:32
DWORD c'est uint.

[ DllImport( "..", CharSet = CharSet.Unicode ) ]
public static extern void GetProcessEnvVar( uint processPID, string varName, StringBuilder varVal );
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
21 déc. 2006 à 11:37
Salut,

L'attribut Out spécifie que le marshalling ne doit se faire qu'en retour de la méthode (de l'appelé vers l'appelant).
Si ton paramètre est un paramètre d'entrée, spécifie le en In (de l'appelant vers l'appelé).

/*
coq
MVP Visual C#
CoqBlog
*/
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
21 déc. 2006 à 11:49
Salut, ce serait mieux de voir le prototype en C. La fonction s'appelle Get.. on peut imaginer que le premier paramètre est en entrée et le second en sortie ? Dans ce cas pour les chaines en sortie c'est un StringBuilder qui doit être initialisé avant l'appel.
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
21 déc. 2006 à 13:05
Ca ne marche toujours pas, voici l'appel

            StringBuilder res=new StringBuilder(512);

            GetProcessEnvVar(pid, "PATH",  res);

J'ai essayé avec un StringBuilder pour le param de sortie :

extern public static void GetProcessEnvVar(long ProcessPID, [In, MarshalAs(UnmanagedType.LPWStr)] string VarName, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder VarVal);

Voici le proto C :

void __stdcall GetProcessEnvVar(DWORD pid, wchar_t* VarName, wchar_t* res)

En effet le 2e est un param d'entrée et le 3e un param de sortie.

D@runia
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
21 déc. 2006 à 13:13
Essaie plutôt, en spécifiant un Charset Unicode sur l'attribut DllImport :
extern public static void GetProcessEnvVar(
   long ProcessPID, 
   [In] string VarName, 
   [Out] StringBuilder VarVal
);

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
21 déc. 2006 à 13:24
Merci mais ça ne marche toujours pas, ma variable VarName est toujours nulle dans ma DLL (Adresse 0x00000000).

Je commence vraiment à me demander comment je vais transmettre ces foutus paramètres, par pigeon voyageur ?!?
0
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
21 déc. 2006 à 13:38
Merci les gars, j'avais mis un long qui décalait tous les params ....

A+

D@runia
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
21 déc. 2006 à 13:45
haha quel ane je fais, je ne l'avais pas vu celui là, pourtant je le connais ce fameux problème de la confusion entre long "C++" (32 bits) et long "C#" (64 bits, System.Int64) -_-

/*
coq
MVP Visual C#
CoqBlog
*/
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
21 déc. 2006 à 14:05
un coq plutôt qu'un âne, non?

<hr size="2" />-Blog-
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
21 déc. 2006 à 14:10
^^

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous