使用P / Invoke时如何将Win32类型映射到C#类型?

前端之家收集整理的这篇文章主要介绍了使用P / Invoke时如何将Win32类型映射到C#类型?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在C#中尝试像 this这样的东西.我发现如何使用P / Invoke from this link从C#调用Win32方法.但是在实现P / Invoke方面遇到了一些困难.

例如,我想要访问的方法之一是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);

猜你在找的Windows相关文章