gpt4 book ai didi

c# - 如何使用编码从指针中读取 uint?

转载 作者:太空宇宙 更新时间:2023-11-03 17:55:40 35 4
gpt4 key购买 nike

我有一个 native 方法,它需要一个指针来写出一个双字(uint)。

现在我需要从 (Int) 指针中获取实际的 uint 值,但是 Marshal 类只有方便的方法来读取(有符号)整数。

如何从指针中获取 uint 值?

我搜索了问题(和谷歌),但找不到我需要的东西。

示例(不工作)代码:

IntPtr pdwSetting = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));

try
{
// I'm trying to read the screen contrast here
NativeMethods.JidaVgaGetContrast(_handleJida, pdwSetting);
// this is not what I want, but close
var contrast = Marshal.ReadInt32(pdwSetting);
}
finally
{
Marshal.FreeHGlobal(pdwSetting);
}

native 函数的返回值是一个介于 0 和 255 之间的双字,其中 255 是完全对比度。

最佳答案

根据您是否可以使用 usafe 代码,您甚至可以执行以下操作:

static unsafe void Method()
{
IntPtr pdwSetting = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(uint)));

try
{
NativeMethods.JidaVgaGetContrast(_handleJida, pdwSetting);
var contrast = *(uint*)pdwSetting;
}
finally
{
Marshal.FreeHGlobal(pdwSetting);
}
}

注意,一个 C++ 函数指针像
void (*GetContrastPointer)(HANDLE handle, unsigned int* setting);

可以编码为
[DllImport("*.dll")]
void GetContrast(IntPtr handle, IntPtr setting); // most probably what you did

但也作为
[DllImport("*.dll")]
void GetContrast(IntPtr handle, ref uint setting);

它可以让你编写类似的代码
uint contrast = 0; // or some other invalid value
NativeMethods.JidaVgaGetContrast(_handleJida, ref contrast);

它在性能和可读性方面都非常出色。

关于c# - 如何使用编码从指针中读取 uint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11829072/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com