Bonjour,
je suis devant un problème de marshaling C/C#que je n'ai pas réussi à résoudre, j'ai besoin d'aide.
J'ai une structure C dans un DLL (dont je n'ai pas le code) qui est déclarée ainsi :
Côté C#, je l'ai marshalée ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 struct virConnectCredential{ int type; const char * prompt; const char * challenge; const char * defresult; char * result; unsigned int resultlen; }
Côté C# un delgate reçoit en paramètre un pointeur sur la structure. La méthode du delegate est déclarée ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 [StructLayout(LayoutKind.Sequential, Pack = 4)] public struct virConnectCredential { [MarshalAs(UnmanagedType.I4)] public int type; [MarshalAs(UnmanagedType.LPStr)] public string prompt; [MarshalAs(UnmanagedType.LPStr)] public string challenge; [MarshalAs(UnmanagedType.LPStr)] public string defresult; public IntPtr result; [MarshalAs(UnmanagedType.U4)] public uint resultlen; }
Le callback depuis C vers C# se passe bien, la structure est passée via le IntPTr "creds". Lorsque que je marshal la structure, la variable "cred" est coorectement initailisée, tout est ok.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public int AuthCallbackHandler([In, Out] IntPtr creds, uint ncred, IntPtr cbdata) { AuthData authData = (AuthData) Marshal.PtrToStructure(cbdata, typeof (AuthData)); virConnectCredential cred = (virConnectCredential)Marshal.PtrToStructure(creds, typeof(virConnectCredential)); }
Mon problème est qu'à ce moment, je dois initialiser les membres "result" et "resultlen" de la structure. Et là je suis coïncé, ça la variable "cred" est une instance marshalée de la structure, or, je dois initialiser l'adresse de "result" afin que la DLL C puisse utiliser ce résultat.
Comment puis-je faire ?
J'ai tenté de calculer exactement les offsets de chaque membre et d'initialiser le membre "result" mais cela abouti à une erreur du typeSi quelqu'un pouvait me tirer de ce mauvais pas...modification de la mémoire protégée...
Partager