2012-11-19 79 views
-3

我有以下問題:UInt32的到IntPtr的

public class ListenThread : SocketInvoke 
{ 
      [DllImport("Ws2_32", CharSet = CharSet.Auto)] 
      public unsafe static extern UInt32 WSAWaitForMultipleEvents(UInt32 cEvents, IntPtr hEventObject, 
      UInt32 fWaitAll, UInt32 dwTimeout, Boolean fAlertable); 

      public void ListenConnections(NetSharedData data) 
      { 
       while (true) 
       { 
        unsafe 
        { 
         if (WSAWaitForMultipleEvents((UInt32)1, data.signal, (UInt32)0, (UInt32)100, false) != WSA_WAIT_TIMEOUT) 
         { 
         } 
        } 
      } 
} 

data.signal是UInt32的我怎麼能轉換爲IntPtr的?我嘗試:

IntPtr signal = (IntPtr)data.signal; 

,但它不工作因爲我需要一個指向data.signal(UInt32)類型的指針,而不是指針的int值,這會使內存異常。

什麼,我需要

一個C++例子:

int signal = 0; 
int* psignal = &signal; 
+0

好吧,你提供的代碼不包含'IntPtr signal = data.signal;' –

+0

而且**總是**告訴我們你的意思是「它不工作」 –

+0

我說我試過,因爲我不知道如何將UInt32轉換爲IntPtr。該代碼提供了我需要設置IntPtr類型和data.signal爲UInt32的API。 – ffenix

回答

2
new IntPtr(data.signal); 

你要什麼在一個64位平臺上有問題,因爲data.s ignal只是掛在地址的低32位上。如果NetSharedData是你的,你應該考慮改變信號的類型爲IntPtr。

如果你想獲得一個地址data.signal:

new IntPtr(&data.signal); 

我不知道這會正確地釘住對象(以防止內存管理器從搬遷的話),我會做以下:

1)改變的PInvoke簽名:

public unsafe static extern UInt32 WSAWaitForMultipleEvents(UInt32 cEvents, 
     void* hEventObject, UInt32 fWaitAll, UInt32 dwTimeout, Boolean fAlertable); 

2)使用固定到管腳對象

fixed (void* s = &data.signal) 
{ 
    if (WSAWaitForMultipleEvents((UInt32)1, s, (UInt32)0, (UInt32)100, false) != WSA_WAIT_TIMEOUT) 
    { 
    } 
} 
+0

thx爲提示病變將其更改爲IntPtr – ffenix

+0

我嘗試使用固定的data.signal,但它告訴我它無法解析對象的地址。 – ffenix

+0

如果signal是一個屬性,那麼你需要製作一個本地拷貝的值。 – jaket

1

這也編譯

 UInt32 unsignedInt = 6; 
     IntPtr iptr = new IntPtr(unsignedInt); 

所以也許這是你想要

IntPtr signal = new IntPtr(data.signal); 
+0

IntPtr應該是指向int的指針,並且該指針只是將int值指定爲指向該異常的指針。 我需要的是一個int值的指針(IntPtr),它包含那個unsignedint = 6 – ffenix

+0

它編譯還是運行並且不會出錯?你可以投任何東西,但不管它是否爆炸是一個不同的故事。 – TyCobb

+0

@ffenix sry,誤解了你的問題,我會編輯 –