Encore une autre de mes questions P/Invoke! J'ai cette fonction C:Passant struct par référence provoquant AccessViolationException
int _ei_x_new(ei_x_buff* x);
Essentiellement, il initialise une nouvelle structure de tampon. En C#, j'ai ceci:
[DllImport(EIDLL, EntryPoint = "_ei_x_new")]
public static extern int ei_x_new(out ei_x_buff x);
ei_x_buff
est assez simple:
typedef struct ei_x_buff_TAG {
char* buff;
int buffsz;
int index;
} ei_x_buff;
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct ei_x_buff {
[MarshalAsAttribute(UnmanagedType.LPStr)]
public string buff;
public int buffsz;
public int index;
}
Mais quand je fais ceci:
ei_x_buff buffer;
Ei.ei_x_new(out buffer);
Je reçois un AccessViolationException:
Att vidé pour lire ou écrire de la mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue.
Ai-je besoin d'allouer de la mémoire ou quelque chose? C'est un morceau de code tellement simple que je ne vois pas de problèmes flagrants.
EDIT: code natif pour _ei_x_new
:
// In my wrapper library
DLL_EXPORT int _ei_x_new(ei_x_buff* x) {
return ei_x_new(x);
}
// In external library being wrapped
int ei_x_extra = 100;
int ei_x_new(ei_x_buff* x)
{
x->buff = malloc(ei_x_extra);
x->buffsz = ei_x_extra;
x->index = 0;
return x->buff != NULL ? 0 : -1;
}
La signature P/Invoke est déjà utilisée. Si vous vouliez dire "ref not out", cela donne le même résultat. La signature native est donnée dans la question: int _ei_x_new (ei_x_buff * x); –
Oh, vous voulez dire la signature native de la structure?J'ai édité ma question pour le montrer. –
La modification à IntPtr a arrêté l'exception. Puis-je le laisser comme ça, ou dois-je utiliser un autre type? –