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

Résolu
maladebe Messages postés 18 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 27 mars 2009 - 19 févr. 2009 à 15:52
maladebe Messages postés 18 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 27 mars 2009 - 20 févr. 2009 à 07:50
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
19 févr. 2009 à 18:38
quoi que ça, c'est mieux :

[ MarshalAs( UnmanagedType.ByValTStr, SizeConst= 256 ) ]
public String str1;
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
19 févr. 2009 à 16:19
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.
0
maladebe Messages postés 18 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 27 mars 2009
19 févr. 2009 à 16:29
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.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 42
19 févr. 2009 à 18:33
[ MarshalAs( UnmanagedType.ByValArray, SizeConst = 256  ) ]
public char[ ] str1; // Attention au CharSet de la struct.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
maladebe Messages postés 18 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 27 mars 2009
20 févr. 2009 à 07:50
Merci beaucoup Lutinore. Ca marche comme je voulais!!!
Grace à :
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst= 256 ) ]
public String str1;
0