Récupération des données d'une fonction d'une dll native

Résolu
Signaler
Messages postés
18
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
27 mars 2009
-
Messages postés
18
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
27 mars 2009
-
Salut,

Je dois récupérer d'une fonction, dans une dll écrite en C/C++, un pointeur sur une structure. Je pensais avoir trouvé comment récupérer les informations du pointeur renvoyé par la fonction décrite ci-dessous:




[





DllImport
(

@"MADLL.dll"

, EntryPoint =

"InitImage"

, SetLastError =

true

, CharSet =

CharSet



.Auto)]






public



static




extern




unsafe




IntPtr

InitImage(

IntPtr

ptrRaw,

int

width,

int

height,

int

resolution,

int

rank,

out




IntPtr



ptrOut);

Ci-dessous, la structure queje dois récupérer :




[





StructLayout
(

LayoutKind

.Sequential)]






class







ErrorContext



{





[





MarshalAs
(

UnmanagedType



.I4)]






public



T__FPQC_Returned_Code



returnedCode;

[





MarshalAs
(

UnmanagedType



.LPStr, SizeConst = 100)]






public



String



errorMessage;

[





MarshalAs
(

UnmanagedType



.LPStr, SizeConst = 256)]






public



String



errorFile;

[





MarshalAs
(

UnmanagedType



.U4)]






public



UInt32



errorLine;

}

Mais lors de l'exécution des instructions suivantes :





IntPtr




ptrErr =
Marshal

.AllocHGlobal(

Marshal

.SizeOf(

typeof

(

ErrorContext



)));

ptrErr = FPQC_InitFingerprintImage(ptrRaw, bmp.Width, bmp.Height, 500, 1,




out

ptrOut);
ErrorContext

eContext = new

ErrorContext
();






Marshal


.PtrToStructure(ptrErr, eContext);



j'ai une exception de type "


Attempted to read or write protected memory"

qui se génère à la dernière ligne.
Je n'arrive donc pas à récupérer les informations contenues dans eContext.

Merci d'avance pour vos éclaircissements!!!

5 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
quoi que ça, c'est mieux :

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst= 256 ) ]
public String str1;
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut, faudrait voir le prototype de ta struct en C, je pense que que les chaines de caractères sont des tableaux inline et non des pointeurs.
Messages postés
18
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
27 mars 2009

Salut Lutinore,

Voici le prototype de la structure :
typedef

struct {T__FPQC_Returned_Codes m__errorcode;

T__Char m__errormessage[150];

T__Char m__errorfile[256];

T__UInt32 m__errorline;

}T__FPQC_Struct_Error_Context;

Alors oui, ce sont bien des tableaux de char mais avec
MarshalAs
(
UnmanagedType
.LPStr, SizeConst = 256)], il devrait pas poser de souci? Enfin je pense.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
[ MarshalAs( UnmanagedType.ByValArray, SizeConst = 256  ) ]
public char[ ] str1; // Attention au CharSet de la struct.
Messages postés
18
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
27 mars 2009

Merci beaucoup Lutinore. Ca marche comme je voulais!!!
Grace à :
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst= 256 ) ]
public String str1;