2009-07-28 6 views
0

Je suis en train de passer cette structure:En passant une structure non géré C++ par référence à une méthode gérée C++ provoque une violation d'accès lorsque la structure est référencée

#pragma unmanaged 
typedef struct 
{ 
    void* data; 
    unsigned nlen; 
    unsigned int type; 
} PARAMETER; 

Pour cette méthode statique de classe:

#pragma managed 
private class __gc GlobalFunctions 
{ 
    static void WriteField(Object* object, PARAMTER& par, unsigned dec) 
    { 
     switch (par.type) 
     { 
      .... 
     } 
    } 
}; 

de cette fonction:

public class __gc WorkerClass 
{ 
    void SetValueAt(long index, Object* value) 
    { 
     PARAMETER aux; 
     aux.type = 3; 
     GlobalFunctions::WriteField(value, aux, 0); 
    } 
}; 

Sur un système 64 bits, je reçois une violation d'accès disant que l'adresse '0x000c' ne peut pas être lue.

Maintenant, sur un système 64 bits, la déréférence de par.type serait l'adresse de 0x0c si la référence de par était un pointeur nul. Sauf que par est sur la pile - je ne passe pas un pointeur nul dans WriteField, mais il me semble en sortir un.

Maintenant, en Managed C++, lors de l'appel d'une méthode gérée d'instance de classe à une autre méthode statique, est le fait que je passe une structure non géré par référence vulnérable à une sorte de problème de triage?

Existe-t-il une documentation Web expliquant comment les structures non gérées sont traitées par du code managé?

Répondre

0

Le code géré et le code non géré doivent-ils être explicitement compilés en tant que gérés/non gérés. Si le code géré et non géré est mélangé dans le même fichier, le pragma géré et le pragma non géré doivent être utilisés. Gardez aussi cela à l'esprit lorsque vous utilisez des fichiers include.

+0

Oublié de préciser que - les # pragma étaient déjà là. – Eli

Questions connexes