使用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#中映射的数据类型? 什么是正确的方法声明,你如何正确地称呼?
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)]字符串.
DWORD_PTR不是一个指针.它是一个无符号的整数,足够大以容纳一个指针.等效的C#类型是System.UIntPtr.
PDH_STATUS似乎只是一个int. PDH_HQUERY是指向句柄(另一个指针)的指针,但您可以假装它是一个整数并使用IntPtr. 把它们放在一起,你的声明应该是: [DllImport("Pdh.dll")] static extern int PdhOpenQueryW( [MarshalAs(UnmanagedType.LPWStr)] string szDataSource,UIntPtr dwUserData,out IntPtr phQuery); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何使用Windows运行时使用C#实现C API?
- 调试 – 如何在Windows Phone 7上调试“未指定的错误”?
- NTFS文件系统误删除数据的恢复教程
- windows-server-2012-r2 – 将Google Chrome配置为连接到配
- 在Windows和LINUX中创建程序库[C]
- 使用Windows Server AppFabric缓存的分布式锁服务
- 如何在多台计算机上自动安装Windows XP?
- .net – 给定选择,混合模式程序集与单独的互操作DLL的优缺点
- windows-server-2012 – Windows Server 2012 – 强制Termi
- windows-phone-7 – WP7音频/视频文件选择器
- windows-server-2003 – 如何在Server 2003上无限
- Windows – RNDIS小工具无法启动
- windows-server-2008 – 高延迟,但ping显示低延迟
- 键盘语言更改在Windows 7上的PhpStorm中不起作用
- windows-server-2003 – 如何诊断无法在Windows
- Windows’start / b’命令问题
- winapi – 如何以编程方式确定Windows的当前默认
- 如何在没有终端的Windows中运行py2exe程序?
- Windows 电脑的四种运行状态工作状态 (Working),
- Windows应用商店应用 – XAML – C# – 在代码中