Question

Je dois encore trouver une bonne référence sur ce sujet. Pour cet exemple, nous prendrons un code C ++ que je suis en train de le port vers C #.

Dans la terre de C nous avons le prototype suivant pour une fonction de bibliothèque externe:

extern "C" DWORD EXPORT FILES_GetMemoryMapping(
  PSTR pPathFile,
  PWORD Size,
  PSTR MapName,
  PWORD PacketSize,
  PMAPPING pMapping,
  PBYTE PagesPerSector);

et il est utilisé comme tel:

FILES_GetMemoryMapping((LPSTR)(LPCTSTR)MapFile, &Size, (LPSTR)MapName, &PacketSize, pMapping, &PagePerSector);

Maintenant, je suis en train de le port la première ligne vers C # et voici où je suis présenté sans chemin clair.

est ce que j'ai à ce jour:

[DllImport("Files.DLL")]
public static extern uint FILES_GetMemoryMapping(
    [MarshalAs(UnmanagedType.LPStr)]
    string pPathFile,
    out ushort Size,
    [MarshalAs(UnmanagedType.LPStr)]
    string MapName,
    out ushort PacketSize,
    IntPtr pMapping,
    out byte PagesPerSector);

Maintenant, la question est: Y at-il bon guide là-bas qui me dit un "PSTR pPathFile" devrait être "string [MarshalAs (UnmanagedType.LPStr)] pPathFile" ... En supposant que est correct

Ou, un qu'un pointeur vers une structure de « pMapping » devient un « hors IntPtr pMapping » ... en supposant que est correct?

Toute aide sur celui-ci les gars?

Était-ce utile?

La solution

  

Je dois encore trouver une bonne référence sur ce sujet

vous allez ici.

Bizarrement, le site est à l'heure actuelle, mais il est une très bonne ressource pour les problèmes de triage. Dans le même temps, vous pouvez utiliser les archives de Archive.net de pinvoke.net http://web.archive.org/web/20080202041852/http://www.pinvoke.net

Autres conseils

Cela semble juste. La première partie de votre question (relative à MarshalAs) indique au compilateur de convertir la variable C # géré dans un PSTR. Marshaling dans l'environnement .NET fait référence au transfert des données entre l'environnement géré et non géré. Ces attributs (parmi plusieurs autres) disent au compilateur comment faire spécifiquement.

Le deuxième point indique qu'il va passer un pointeur sur struct. Le type IntPtr dans .NET est un type managé qui est utilisé pour conserver un élément particulier de la mémoire. Dans le monde .NET, les pointeurs (généralement) n'existent pas, mais il existe toujours des types de référence. Pointeur et gérer la gestion est faite pour nous par le CLR. Le struct IntPtr est utilisé lorsque le marshaling des pointeurs vers des structures de données ou des types primitifs

En plus de la P / site Invoke, Adam Nathan de NET et COM. Le Guide d'interopérabilité complet est quelque chose d'utile d'ajouter à votre bibliothèque si vous avez plus d'un intérêt dans le passage Interop .NET

Kev

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