2010-04-20 9 views
1

Ceci est mon c struct ++ (utilisation multi-octets Jeu de caractères)maréchal géré string [] CHAR non géré **

typedef struct hookCONFIG { 
    int threadId; 
    HWND destination; 

    const char** gameApps; 
    const char** profilePaths; 
} HOOKCONFIG; 

Et struct .Net

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
public struct HOOKCONFIG { 
    public int threadId; 
    public IntPtr destination; 

    // MarshalAs? 
    public string[] gameApps; 

    // MarshalAs? 
    public string[] profilePaths; 
} 

Je suis un problème que la façon dont puis-je marshaler le tableau de chaînes? Quand en C++ I j'accéder à la variable struct "profilePaths" a obtenu une erreur comme ceci:

Une exception non gérée du type 'System.AccessViolationException' a eu lieu dans App.exe

Informations complémentaires: Tentative de lecture ou écrire une mémoire protégée. C'est souvent une indication que l'autre mémoire est corrompue.

MessageBox(0, cfg.profilePaths[0], "Title", MB_OK); // error ... Orz 
+0

Pouvez-vous essayer commentant le HWND/IntPtr? –

Répondre

1

façon simple: le changement prototype à IntPtr []:

public IntPtr[] gameApps; 
public IntPtr[] profilePaths; 

Maintenant, quand vous vous appelez besoin d'à peu près le psudo code suivant:

GCHandle handle = GCHandle.Alloc(string); 
gameApps = new IntPtr[] { GCHandle.ToIntPtr(handle) }; 

// Unmanaged call 

handle.Free(); 
Questions connexes