1

我真的很努力在 C# 中使用CallNtPowerInformation函数。我需要获取 Windows SystemExecutionState。(此处列出的可能值)。

我找到了合适的 C# 签名:

    [DllImport("powrprof.dll", SetLastError = true)]

    private static extern UInt32 CallNtPowerInformation(
         Int32 InformationLevel,
         IntPtr lpInputBuffer,
         UInt32 nInputBufferSize,
         IntPtr lpOutputBuffer,
         UInt32 nOutputBufferSize
         );

现在我需要使用信息级别 16 来读取“SystemExecutionState”。这是我到目前为止的代码:

IntPtr status = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(ulong)));
UInt32 returnValue = CallNtPowerInformation(
    16, 
    (IntPtr)null, 
    0, 
    status, (
    UInt32)Marshal.SizeOf(typeof(ulong)));
Marshal.FreeCoTaskMem(status);

根据微软文档:

lpOutputBuffer 缓冲区接收一个包含系统执行状态缓冲区的 ULONG 值。

如何从 IntPtr 获取 ULONG 值?

4

2 回答 2

2

使用 aout uint而不是IntPtr.

[DllImport("powrprof.dll", SetLastError = true)]
private static extern UInt32 CallNtPowerInformation(
     Int32 InformationLevel,
     IntPtr lpInputBuffer,
     UInt32 nInputBufferSize,
     out uint lpOutputBuffer,
     UInt32 nOutputBufferSize
);


uint result;
CallNtPowerInformation(..., out result);
于 2012-04-22T13:41:50.590 回答
1

调用Marshal.ReadInt32(status)以获取值。

uint statusValue = (uint)Marshal.ReadInt32(status);

该类Marshal具有一整套ReadXXX方法,可让您从非托管内存中读取。

于 2012-04-22T13:43:55.963 回答