Demande d'information sur la récupération d'un tableau de strings via le marshal

Signaler
Messages postés
1
Date d'inscription
mardi 25 janvier 2005
Statut
Membre
Dernière intervention
25 janvier 2005
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,

Je dispose d'une DLL en C contenant la fonction suivante :

void getInfo(const char** ppInfo)

"ppInfo" est un argument de sortie, destiné à me fournir l'adresse de début d'une zone de chaînes de caractères.
Cette zone de chaînes de caractères est représentable de la façon suivante :
"arg1=value1"
"arg2=value2"
"arg3=value3"
"arg4=value4"
""

Chaque chaîne de caractères est terminée par le caractère NULL, et la dernière chaîne de caractères est terminée par deux caractères NULL.

Je souhaite accéder à cette fonction, via une application C#, en utilisant le marshaling.
la portion de code concernée est la suivante :

[DllImport("maDll", EntryPoint = "getInfo", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]

static
extern void
getInfo(IntPtr ppInfo);



public
int Get_DLL_Info(
ref
string[] p_saInfo)
{

try
{
IntPtr l_ppInfo = Marshal.AllocHGlobal(4
); //allocation de mémoire pour l'adresse de début de
//zone de chaîne de caractères

getInfo(l_ppInfo); //appel à la DLL

unsafe
{

char c;
//récupération des dix premiers caractères de la zone de chaines de caractères (pour faire simple pour l'instant)

for (
int i = 0; i < 10; i++)
{

c = l__ppInfo[i];
}
}

Marshal.FreeHGlobal(l_ppInfo); //libération de mémoire
}
c
atch(System.Exception e){}

}



Ce code ne fonctionne malheureusement pas et l'affichage des dix premiers caractères de la zone est erroné. Comme j'arrive à les récupérer via une application VC++6, je pense que l'utilisation que je fais du marshaling dans mon application C# est mauvaise.
Quelqu'un aurait-il déjà rencontré ce problème et pourrait donc m'aider et/ou me donner des pistes ?
Merci d'avance.

lj76

1 réponse

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Petite idée : regarde du côté de Marshal.PtrToStringAnsi pour la lecture de ta chaine.

Cocoricoooooooo !!!!
coq
MVP Visual C#