J'essaie de faire quelque chose comme Ce a > en C #. J'ai découvert comment appeler les méthodes Win32 de C # à l'aide de p / invoquée à partir de ce lien a>. Cependant, j'ai rencontré des difficultés à mettre en œuvre p / invoke. Par exemple, l'une des méthodes que je voudrais accéder est PDHopenQuery ,
Signature: p> [DllImport("Pdh.dll")]
static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,
DWORD_PTR dwUserData, out PDH_HQUERY *phQuery);
3 Réponses :
[DllImport("Pdh.dll")] static extern Int32 PdhOpenQuery(string szDataSource, IntPtr dwUserData, ref IntPtr phQuery);
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.
IIRC LPCTSTR tombe vers: Lp == pointeur long // relique de 16 à 32 bits Thunking P>
c == constante p>
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 P>
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. P>
pdh_status est un pointeur sur une structure DH_Status, vous devrez donc définir une structure C # pour correspondre. p>
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>
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é. P>
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);
Correction: uintptr code> doit être
uintptr dwuserdata code>? 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 i> 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 code>, puis utiliser le
ptrtostringansi code> ou
ptrtostringuni code> Fonctions dans le système
System.Runtime. Interopservices.marshal code> classe à la chaîne.