modifier une struct marshallée en C#
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 :
Code:
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#, je l'ai marshalée ainsi :
Code:
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;
} |
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:
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));
} |
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.
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 type
Citation:
modification de la mémoire protégée...
Si quelqu'un pouvait me tirer de ce mauvais pas...