[英]UInt32 to 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;
new IntPtr(data.signal);
您將在 64 位平台上遇到問題,因為 data.signal 僅掛在地址的低 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固定對象
fixed (void* s = &data.signal)
{
if (WSAWaitForMultipleEvents((UInt32)1, s, (UInt32)0, (UInt32)100, false) != WSA_WAIT_TIMEOUT)
{
}
}
這也編譯
UInt32 unsignedInt = 6;
IntPtr iptr = new IntPtr(unsignedInt);
所以也許這就是你想要的
IntPtr signal = new IntPtr(data.signal);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.