Question

Étant donné la fonction C suivante dans une DLL:

char * GetDir(char* path );

Comment voulez-vous P / Invoke cette fonction dans C # et marshal le char * correctement. .NET semble savoir comment faire LPCTSTR mais quand je ne peux pas trouver un marshaling qui ne provoque pas l’exception d’une exception NotSupportedException lorsqu’il appelle cette fonction.

Était-ce utile?

La solution

La réponse d’OregonGhost n’est correcte que si le caractère * renvoyé par GetDir est attribué dans HGlobal ou LocalAlloc. Je ne me souviens plus lequel, mais le CLR supposera que tout type de retour de chaîne d'une fonction PInvoke a été alloué à l'un ou à l'autre.

Une méthode plus robuste consiste à taper le retour de GetDir sur IntPtr. Vous pouvez ensuite utiliser n’importe laquelle des fonctions Marshal.PtrToStringAnsi pour obtenir un type de chaîne. Cela vous donne également la possibilité de libérer la corde de la manière que vous préférez.


[DllImport("your.dll", CharSet = CharSet.Ansi)]
IntPtr GetDir(StringBuilder path);

Pouvez-vous nous donner d'autres indications sur le comportement de GetDir? Cela modifie-t-il la chaîne d'entrée? Comment la valeur renvoyée est-elle allouée? Si vous pouvez fournir cela, je peux donner une bien meilleure réponse.

Autres conseils

Essayez

[DllImport("your.dll", CharSet = CharSet.Ansi)]
string GetDir(StringBuilder path);

chaîne est automatiquement transformée en chaîne terminée par zéro, et avec la propriété CharSet, vous indiquez au programmeur qu'il doit utiliser ANSI plutôt que Unicode. Remarque: Utilisez string (ou System.String) pour un caractère const *, mais StringBuilder pour un caractère *.

Vous pouvez également essayer MarshalAs, comme dans cet exemple .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top