[已解决问题]
解决于 2008-07-12 20:05
请教CreateIoCompletionPort在c#里如何使用<br>[DllImport("kernel32.dll")]<br>
static extern IntPtr CreateIoCompletionPort(IntPtr FileHandle,<br>
IntPtr ExistingCompletionPort, UIntPtr CompletionKey,<br>
uint NumberOfConcurrentThreads);<br>上面是原型,其中CompletionKey这个参数的类型是UIntPtr,这个参数在C++里可以随便传一个结构进去,完了可以在获取完成端口状态(GetQueuedCompletionStatus)的时候取出来,可我怎么才能把c#里的一个类转换成UIntPtr类型呀。<br>c++里的定义如下<br>CreateIoCompletionPort(<br> __in HANDLE FileHandle,<br> __in_opt HANDLE ExistingCompletionPort,<br> __in ULONG_PTR CompletionKey,<br> __in DWORD NumberOfConcurrentThreads<br> );<br>使用的时候如下<br>CreateIoCompletionPort((HANDLE) Accept, CompletionPort, (DWORD) PerHandleData,<br> 0)<br>其中PerHandleData是一个struct,定义如下<br>typedef struct <br>{<br> SOCKET Socket;<br>} PER_HANDLE_DATA, * LPPER_HANDLE_DATA;<br>而我的c#的定义如下<br>[StructLayout(LayoutKind.Sequential)]<br>class PER_HANDLE_DATA<br>{<br> public SafeHandleMinusOneIsInvalid Socket;<br>}<br>我的调用如下<br>GCHandle gch_PerHandleData = GCHandle.Alloc(PerHandleData);<br>PerHandleData.Socket = Accept;<br>SafeFileHandle iocp = CreateIoCompletionPort(Accept.DangerousGetHandle(),<br> CompletionPort.DangerousGetHandle(),(IntPtr) gch_PerHandleData, 0);<br>gch_PerHandleData.Free();<br><br>当然上面的代码肯定不对,我把GCHandle强制转换成IntPtr了,我如何转换成UIntPtr呀。
蛙蛙王子
|
菜鸟二级
|
园豆:
465
提问于:2008-07-10 23:57