2009-07-28 5 views
0
verwiesen wird

Ich versuche, diese Struktur zu übergeben:eine nicht verwaltete C++ Struktur unter Bezugnahme auf ein verwaltetes C++ Methode Passing verursacht eine Zugriffsverletzung, wenn die Struktur

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

Hierher statische Methode:

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

Aus dieser Funktion:

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

Auf einem 64-Bit-System, erhalte ich eine Verletzung Zugang zu sagen, dass Die Adresse '0x000c' kann nicht gelesen werden.

Jetzt, auf einem 64-Bit-System, wäre die Dereferenzierung von par.type die Adresse von 0x0c, wenn die Referenz von par ein Nullzeiger wäre. Außer Par ist auf dem Stapel - ich gebe keinen Null-Zeiger in WriteField, aber ich scheine einen zu bekommen.

Jetzt, in verwalteten C++, beim Aufruf von einer verwalteten Klasseninstanz Methode zu einer anderen statischen Methode, ist die Tatsache, dass ich eine unmanaged Struktur übergeben anfällig für eine Art Marshalling-Problem?

Gibt es eine Webdokumentation, in der erklärt wird, wie nicht verwaltete Strukturen mit verwaltetem Code behandelt werden?

Antwort

0

Lassen Sie den verwalteten und den nicht verwalteten Code explizit als verwaltet/nicht verwaltet kompilieren. Wenn der verwaltete und nicht verwaltete Code in derselben Datei gemischt ist, muss das Pragma verwaltet und Pragma nicht verwaltet verwendet werden. Beachten Sie dies auch, wenn Sie Include-Dateien verwenden.

+0

Vergessen zu spezifizieren, dass - die # Pragma's schon da waren. – Eli

Verwandte Themen