如何阅读从编组站一个指针UINT?(How do I read a uint from a poin

2019-09-30 04:48发布

我有需要一个指向写出一个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);
        }

从本机函数的返回值与255是全对比度0和255之间的双字。

Answer 1:

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

这是在性能和​​可读性优越。



Answer 2:

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

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

例如:

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

输出4294967295



Answer 3:

使用Marshal.PtrToStructure重载这需要一个IntPtr和类型,并通过在typeof运算(UINT) -这应该工作!

希望这可以帮助!



文章来源: How do I read a uint from a pointer with Marshalling?