如何从编组指针读取uint?

时间:2012-08-06 13:16:31

标签: c# pinvoke marshalling

我有一个本机方法需要一个指针来写出一个dword(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是完全对比。

3 个答案:

答案 0 :(得分:5)

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

在性能和可读性方面都很出色。

答案 1 :(得分:4)

您只需将其转换为uint

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

例如:

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

输出4294967295

答案 2 :(得分:0)

使用带有IntPtr和类型的Marshal.PtrToStructure overload并传入typeof(uint) - 这应该有效!

希望这有帮助!