2009-04-07 9 views
3

Je n'ai pas encore trouvé une bonne référence sur ce sujet. Pour cet exemple, nous allons prendre du code C++ que j'essaye de transférer sur C#.C# formatage paramètres de la fonction Dll externe

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 sur C# et voici où je suis présenté sans chemin clair.

C'est ce que j'ai jusqu'à présent:

[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 » doit être « [MarshalAs (UnmanagedType.LPStr)] string pPathFile "... En supposant que c'est correct? Ou, qu'un pointeur vers une structure "PMAPPING" devient un "out IntPtr pMapping" ... en supposant que c'est correct?

Toute aide sur celui-ci les gars?

+0

www.pinvoke.net a une grande référence de signatures C# pour les appels Win32. Souvent, vous pouvez trouver la fonction exacte que vous recherchez ou si ce n'est pas une seule qui peut servir de point de départ. Il semble être en baisse pour le moment cependant. – sipwiz

Répondre

0

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

Le deuxième point indique qu'il va passer un pointeur vers la structure. Le type IntPtr dans .NET est un type géré utilisé pour conserver une partie de la mémoire. Dans le monde .NET, les pointeurs (généralement) n'existent pas, bien qu'il existe toujours des types de référence. La gestion des pointeurs et des poignées est faite pour nous par le CLR. Le struct IntPtr est utilisé lors du marshaling des pointeurs vers des structures de données ou les types primitifs

Questions connexes