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

标签 c# winapi pinvoke performancecounter

我正在尝试做类似 this 的事情在 C# 中。我发现了如何使用 P/Invoke 从 C# 调用 Win32 方法 from this link .然而,我在实现 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#?

LPCTSTRconst TCHAR* 的类型定义。

TCHAR 试图抽象出 Windows API 存在于“ANSI”(特定于语言环境编码的 char 字符串)和“Unicode”中的事实(UTF-16) 版本。没有实际的 PdhOpenQuery 函数;有一个接受 ANSI 字符串的 PdhOpenQueryA 函数和一个接受 UTF-16 字符串的 PdhOpenQueryW 函数。

C# 使用 UTF-16 字符串,因此您会更喜欢这些函数的“W”版本。使用 PdhOpenQueryW。然后第一个参数具有 C++ 类型 const wchar_t*。 C# 类型是 [MarshalAs(UnmanagedType.LPWStr)] string

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);

关于c# - 使用 P/Invoke 时如何将 Win32 类型映射到 C# 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3598226/

相关文章:

c# - 流畅验证 : Is it possible to add a RuleSet while invoking a validator using ValidateAndThrow

c# - C#中的套接字编程

c# - 迭代嵌套的 JSON 对象数组并访问内部 token 值

c++ - C中的多线程-WINAPI

c# - PInvoke 不平衡堆栈

pinvoke - P/Inoke 捕获 native 异常

c# - 是否可以使用具有一系列值的哈希表?

C++ 选择文件夹,包含文件

c - 检测所有当前发出信号的信号量

c# - 在 C# 中打开到文件描述符的管道连接