0

我正在尝试使用 PInvoke 和 .Net4.5访问电池设备信息(在Enumerating Battery Devices行)。我有一个 WPF 应用程序运行良好,并且能够获取各种低级电池信息。

现在我正在尝试将同一个应用程序修改为 WinRT 现代应用程序。Win32 API(例如 SetupDiEnumDeviceInterfaces、SetupDiGetDeviceInterfaceDetail)在 WinRT 中运行良好。但是当涉及到 CreateFile 时,我得到了无效的句柄 (-1) 并且 Marshal.GetLastWin32Error() 给出了 1008 (Error_No_Token)。Marshal.GetHRForLastWin32Error().ToString() 给出“-2147023888”

知道如何在 WinRT 中通过 PIvoke 使用 CreateFile 吗?

[DllImport ("kernel32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    internal static extern IntPtr CreateFile(
      string lpFileName,
      uint dwDesiredAccess,
      uint dwShareMode,
      IntPtr SecurityAttributes,
      uint dwCreationDisposition,
      uint dwFlagsAndAttributes,
      IntPtr hTemplateFile
      );

   //var hBattery = NativeMethods.CreateFile (devicePath, FileAccess.ReadWrite, FileShare.ReadWrite, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
    var hBattery = NativeMethods.CreateFile (devicePath, 3, 3, IntPtr.Zero, 3, 128, IntPtr.Zero);
    if ( hBattery == new IntPtr (-1) )
    { throw new System.Exception(Marshal.GetHRForLastWin32Error().ToString()); }
4

1 回答 1

1

知道如何在 WinRT 中通过 p/invoke 使用 CreateFile 吗?

你不能这样做。WinRT 限制了允许用户代码调用的 API,该函数在 WinRT 中不可用。的文档CreateFile说明了限制:

要求

支持的最低客户端:Windows XP [仅限桌面应用程序]

支持的最低服务器:Windows Server 2003 [仅限桌面应用程序]

文本桌面应用程序仅意味着WinRT 不可用

在 WinRT 上,您应该使用富有想象力的CreateFile2. 看看它的要求:

要求

支持的最低客户端:Windows 8 [桌面应用程序 | Windows 应用商店应用]

支持的最低服务器:Windows Server 2012 [桌面应用程序 | Windows 应用商店应用]

文本Windows Store apps表示该功能可用于 WinRT 代码。

使用 WinRT 时,有大量传统的 Windows API 不可用。在尝试调用 API 函数之前,您应该养成检查文档需求部分的习惯。

于 2013-11-07T20:45:14.037 回答