例如,我想要访问的方法之一是PdhOpenQuery,
签名:
PDH_STATUS PdhOpenQuery( __in LPCTSTR szDataSource,__in DWORD_PTR dwUserData,__out PDH_HQUERY *phQuery );
我认为相应的C#声明应该是这样的
[DllImport("Pdh.dll")] static extern PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,DWORD_PTR dwUserData,out PDH_HQUERY *phQuery);
我的问题:
什么是LPCTSTR,以及在C#中映射的数据类型?
如何映射一个指针类型DWORD_PTR? pinvoke文章说DWORD映射到UInt32,但指针如何?
我认为PDH_STATUS和PDH_HQUERY是库的特定结构(我还不确定).如何映射这些?
什么是正确的方法声明,你如何正确地称呼?
What is LPCTSTR,and to what data type
does it map in C#?
LPCTSTR是const TCHAR *的typedef.
TCHAR尝试抽象出Windows API存在于“ANSI”(特定于语言环境的编码中的字符串)和“Unicode”(UTF-16)版本)中的事实.没有实际的PdhOpenQuery函数;有一个PdhOpenQueryA函数接受一个ANSI字符串和一个PdhOpenQueryW函数,它接受一个UTF-16字符串.
C#使用UTF-16字符串,因此您希望更喜欢这些功能的“W”版本.使用PdhOpenQueryW.那么第一个参数有C类型const wchar_t *. C#类型是[MarshalAs(UnmanagedType.LPWStr)]字符串.
How to map a pointer type DWORD_PTR?
The pinvoke article says DWORD maps to
UInt32,but how about pointers?
DWORD_PTR不是一个指针.它是一个无符号的整数,足够大以容纳一个指针.等效的C#类型是System.UIntPtr.
I think PDH_STATUS and PDH_HQUERY are
specific struct to the library (I’m
not sure yet). how do I map these?
PDH_STATUS似乎只是一个int.
PDH_HQUERY是指向句柄(另一个指针)的指针,但您可以假装它是一个整数并使用IntPtr.
把它们放在一起,你的声明应该是:
[DllImport("Pdh.dll")] static extern int PdhOpenQueryW( [MarshalAs(UnmanagedType.LPWStr)] string szDataSource,UIntPtr dwUserData,out IntPtr phQuery);