8
votes

Dllimport et char *

J'ai une méthode que je veux importer à partir d'une DLL et qu'il a une signature de: xxx

J'ai essayé xxx

et xxx

mais que l'on n'a rien retourné dans la variable DrivelleTter.


0 commentaires

4 Réponses :


8
votes

Il apparaît la fonction getdrivetter s'attend à un char * qui pointe une mémoire suffisante pour contenir la lettre de lecteur.

Je pense que le moyen le plus simple d'aborder ce problème est de passer un cru et d'envelopper les appels sur getdrivetter dans une API qui prend soin de la gestion des ressources et de la conversion à une chaîne . xxx


3 commentaires

@Malfist, la valeur i1 indique au CLR de repasser la valeur sous forme d'un entier 1 octet. Il était en fait incorrect dans cet échantillon comme I4 est la valeur correcte (mise à jour un peu mal). Pourquoi consulter cette entrée de blog, j'ai écrit sur Marshalling Bool Values: blogs.msdn.com/jaredpar/archive/2008/10/14/...


Quand je le fais i4, je reçois la maréchaldirectiveException


@Malfist, désolé, il devrait être non gérédype.bool . Été l'un de ces jours.



0
votes

Le StringBuilder est probablement la voie à suivre, mais vous devez définir la capacité du constructeur de chaînes avant d'appeler la fonction. Étant donné que c # n'a aucune idée de la quantité de mémoire que getdriveter code> utilisera, vous devez vous assurer que le StringBuilder dispose de suffisamment d'espace. Le marshaller passera ensuite un char * code> attribué à cette longueur à la fonction et marhsall le retourner sur le StringBuilder.

[return:MarshalAsAttribute(UnmanagedType.I4)]
private static extern bool GetDriveLetter(StringBuilder DriveLetter);

public static bool GetDriveLetter(out string driverLetter) {
  StringBuilder buffer = new StringBuilder(10);
  bool ret = GetDriveLetter(buffer);
  driveLetter = buffer.ToString();
  return ret;
}


3 commentaires

Ne renvoie pas la chaîne correcte, contrairement à la réponse acceptée.


Et si vous ajoutez Chaset = Charset.ansi à l'attribut Dllimport? C'est si vous vous souciez que vous avez une solution de travail.


Ajout de Chalet.ansi au Dllimport ne fait aucune différence.



0
votes
[DllImport("mydll.dll")]
public static extern bool GetDriveLetter([MarshalAs(UnmanagedType.LPStr)]  string DriveLetter)

0 commentaires

0
votes

J'ai eu une situation connexe dans laquelle la fonction avait un paramètre char * code> et j'avais manqué le Charset code> Affectation:

[DllImport("library.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr MyFunc(string myString);


0 commentaires