2012-08-06 16 views
1

我有一个本地方法,它需要一个指针来写出一个双字(uint)。如何从带有编组的指针读取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之间的双字。

+0

您能否提供您的示例代码供我们参考。 – 2012-08-06 13:20:08

回答

4

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

注意,像

void (*GetContrastPointer)(HANDLE handle, unsigned int* setting); 

C++函数指针可以被编组为

[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); 

这是在性能和​​可读性出众的代码。

+0

我已经完全忘记了裁判,我是多么愚蠢。这就是我最终的结果,谢谢。 – Davio 2012-08-07 06:29:45

0

使用Marshal.PtrToStructure overload需要一个IntPtr和一个类型并传入typeof(uint) - 应该可以工作!

希望这会有所帮助!

+0

这似乎工作,虽然我不确定,因为目前本地方法将始终返回0由于硬件限制。一旦我能够测试它,我会回复。 – Davio 2012-08-06 13:42:40

+0

@Davio - 什么硬件限制? – 2012-08-06 15:12:36

+0

@Ramhound我相信他的意思是他的本地库在这个时候总是返回0(因为有一些限制) - 所以他没有办法用大于int.MaxValue的值来测试他的库。我对么? – Ani 2012-08-06 15:37:03

3

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

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

例如:

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

输出4294967295

+0

但是正值会具有相同的值,这是错误的,因为初始int读数是错误的。 – Davio 2012-08-07 06:33:40

+0

不,上面的代码做你想做的。你在这里有点困惑。此代码的行为方式与您接受的答案中的不安全代码完全相同。 – 2012-08-07 07:04:27

+0

好吧,我认为像101这样的值在读取时是5,而在用ReadInt32读取时是-1,而转换为-1会给出你记下的高值,而不是我想要的5。 在某种程度上,我认为它会错误地读取高位作为符号,但是。 – Davio 2012-08-07 13:15:32