2010-10-08 6 views
1

J'ai deux composants communicants - l'un géré, l'autre non géré. Le gestionnaire doit extraire une chaîne de caractères de l'implémentation non gérée (la même chaîne ou juste une copie). J'ai essayé le code suivant.Passage d'une chaîne de caractères const char * de non géré à géré

// Unmanaged code 
const char* GetTestName(Test* test) 
{ 
    return test->getName(); 
} 

// Managed wrapper 
[DllImport(DllName, EntryPoint = "GetTestName")] 
public static extern IntPtr GetTestName(IntPtr testObj); 

// API Invocation 
IntPtr testName = GetTestName(test); 
string testStr = Marshal.PtrToStringAuto(testName); 

Mais, la valeur de testStr n'est pas ce qui est attendu. Est-ce que quelqu'un sait ce que je fais mal ici? Toute suggestion serait vraiment utile.

Répondre

2

Vous êtes proche mais vous devez utiliser PtrToStringAnsi(). Auto utilise le système par défaut qui sera Unicode.

+0

J'ai essayé ça. N'a pas fonctionné. J'ai effectivement essayé toutes les méthodes PtrToStringX() disponibles. Est-ce que je fais quelque chose de mal à rassembler les données? L'unité non gérée est responsable de la mémoire de chaîne de caractères. – Elroy

+0

Non, votre déclaration pinvoke est correcte. Je m'assurerais de m'assurer que l'argument * test * est correct. Déboguez ceci, activez le débogage non géré et définissez un point d'arrêt sur test-> getName(). –

+0

Yup, j'ai compris. getName() est buggé. Merci Hans. – Elroy

1

Je suggère cela, au lieu:

[DllImport(DllName, EntryPoint = "EntryPoint")] 
[MarshalAs(UnmanagedType.LPStr)] 
public static extern StringBuilder GetTestName(IntPtr testObj); 

UnmanagedType.LPStr travaille avec des cordes et System.Text.StringBuilder, et peut-être d'autres (je ne jamais utilisé les deux). J'ai trouvé StringBuilder pour travailler plus régulièrement, cependant.

Voir this MSDN article pour plus d'informations sur les différentes options de regroupement de chaînes.

+0

Hah, et j'ai ajouté cela dès que vous avez choisi une réponse. Je suis content que vous l'ayez compris :) – Moudis

+0

J'apprécie la suggestion. Je vais vérifier. – Elroy

Questions connexes