1

我有一个本机方法,它需要一个指针来写出一个双字(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);
        }

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

4

3 回答 3

6

根据您是否可以使用 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);

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

于 2012-08-06T20:58:49.477 回答
5

您可以简单地将其转换为uint

uint contrast = (uint)Marshal.ReadInt32(pdwSetting);

例如:

int i = -1;
uint j = (uint)i;
Console.WriteLine(j);

输出4294967295

于 2012-08-06T20:39:50.767 回答
0

使用采用 IntPtr 和类型并传入 typeof(uint) 的Marshal.PtrToStructure 重载- 这应该可以工作!

希望这可以帮助!

于 2012-08-06T13:21:27.700 回答