11
votes

Comment mapper Win32 Types à C # Types lorsque vous utilisez p / invoke?


0 commentaires

3 Réponses :


0
votes
[DllImport("Pdh.dll")]
    static extern Int32 PdhOpenQuery(string szDataSource, 
        IntPtr dwUserData, ref IntPtr phQuery);

3 commentaires

Il ne compilera toujours pas car pdh_status n'est pas reconnu. Vous pouvez également expliquer pourquoi String et IntPTR?


Oups, désolé, la valeur de retour devrait être IntPTR. IntPTR est wrapper .NET pour un pointeur non géré. Étant donné que la poignée est généralement du pointeur ou un nombre qui a la même taille que le pointeur, IntPTR est également utilisé pour les poignées. Pourquoi string? Eh bien, parce que LPCTSTR est une chaîne.


Eh bien, en fait, pdh_status est juste un nombre, il est donc préférable de le définir comme int32.



0
votes

IIRC LPCTSTR tombe vers: Lp == pointeur long // relique de 16 à 32 bits Thunking

c == constante

TSTR == TSTR // TString, type d'espace réservé qui sera substitué à différents types de cordes en fonction de divers en-têtes C et #defines

Qu'est-ce que cela signifie pour vous: c'est un pointeur à une chaîne, car c # Utilisez simplement une chaîne et tout ira bien.

pdh_status est un pointeur sur une structure DH_Status, vous devrez donc définir une structure C # pour correspondre.

Check Out p / invoke.net pour quelques exemples d'utilisation de P / invoke sur des en-têtes de fenêtres standard, des structures et fonctions. Le site Web est un type de Klunky, il vous suffit de continuer à cliquer sur la colonne de gauche.

p / invoke n'est pas bien documenté, mais une fois que vous avez mappé la structure et l'appel de la fonction externe, vous devez être en activité.


0 commentaires

19
votes

Qu'est-ce que LPCTSTR et à quel type de données Est-ce que ma carte en c #? p>

lpctstr code> est un typef pour const tchar * code>. p>

TCHAR code> est une tentative de résumé du fait que L'API Windows existe dans les deux "ANSI" ( Char CODE> Strings dans un encodage spécifique à la locale) et "Unicode" (UTF-16) versions. Il n'y a pas de pdHopenQuery code>; Il y a une fonction pdhopenquerya code> qui prend une chaîne ANSI et une fonction pdhopenqueryw code> qui prend une chaîne UTF-16. p>

C # utilise UTF-16 Strings, Vous voudrez donc préférer la version «W» de ces fonctions. Utilisez pdhopenqueryw code>. Ensuite, le premier paramètre a C ++ type const wchar_t * code>. Le type C # est [marshalas (non gérédype.lpwstr)] chaîne code>. P>

Comment mapper un pointeur de type DWord_ptr? L'article de Pinvoke dit Dword Caps sur Uint32, mais que diriez-vous des pointeurs? P> blockQuote>

dword_ptr code> n'est pas un pointeur. C'est un integer em> sans signé em> assez grand pour tenir em> un pointeur. Le type C # équivalent est system.uintptr code>. P>

Je pense que pdh_status et pdh_hquery sont struct spécifique à la bibliothèque (je suis pas encore sûr). Comment puis-je mapper ces? P> blockquote>

pdh_status code> semble être juste un int code>. p>

pdh_hquery code> est un pointeur sur une poignée (Un autre pointeur), mais vous pouvez simplement prétendre que c'est un entier et utilisez intptr code>. p>

Mettre tout ensemble, votre déclaration doit être: p>

[DllImport("Pdh.dll")]
static extern int PdhOpenQueryW(
    [MarshalAs(UnmanagedType.LPWStr)] string szDataSource, 
    UIntPtr dwUserData,
    out IntPtr phQuery);


3 commentaires

Correction: uintptr doit être uintptr dwuserdata ? Une autre question, comment faut-il appeler la méthode?


Est-ce qu'il y a de toute façon que LPCTSTR pourrait mapper pour une INTPTR? Shgetfileinfo API (ref: MSDN .microsoft.com / fr-US / US / Bibliothèque / Windows / Bureau / ... ) a le premier param de " in lpctstr pszpath" et la plupart du temps, je vois des gens l'utiliser comme un string". Mais dans un cas, j'ai trouvé que quelqu'un que je suppose l'utiliser comme un intPTR ..? (Ref: Stackoverflow.com/a/14293350/1039753 )


@Arvobowen: Oui, vous pouvez déclarer le paramètre en tant que intptr , puis utiliser le ptrtostringansi ou ptrtostringuni Fonctions dans le système System.Runtime. Interopservices.marshal classe à la chaîne.