From: USB Device User on 7 Jun 2010 17:44 Here is my code: public bool Send(SafeFileHandle fileHandle, string information) { Byte[] writeBuffer = new byte[information.Length]; //initialize buffer int iCount = 0; while (iCount < information.Length) { writeBuffer[iCount] = System.Convert.ToByte(information.ToCharArray()[iCount]); iCount++; } int bytesWritten = 0; NativeOverlapped wo = new NativeOverlapped(); try { bool succeed = WriteFile(fileHandle, writeBuffer, writeBuffer.Length, ref bytesWritten,ref wo); if (succeed || Marshal.GetLastWin32Error() == ERROR_IO_PENDING) return true; else return false; } catch (Exception e) { throw e; } } I always got the exception when I debug WriteFile call: InvalidOverlappedToPinvoke was detected Message: An overlapped pointer (0x000000001CEAC258) that was not allocated on the GC heap was passed via PInvoke to the Win32 function 'WriteFile' in module 'kernel32.DLL'. If the AppDomain is shut down, this can cause heap corruption when the async I/O completes. The best solution is to pass a NativeOverlapped structure retrieved from a call to System.Threading.Overlapped.Pack(). If the AppDomain exits, the CLR will keep this structure alive and pinned until the I/O completes. How can I fix it? I tried the following and passed ptrUWO instead of wo into WriteFile. It did not work. NativeOverlapped wo = new NativeOverlapped(); wo.OffsetLow = 0; wo.OffsetHigh = 0; wo.EventHandle = IntPtr.Zero; IntPtr ptrUWO = Marshal.AllocHGlobal(Marshal.SizeOf(wo)); Marshal.StructureToPtr(wo, ptrUWO, true); I also tried the following and passed intOverlapped into WriteFile. It did not work either. IAsyncResult asyncResult; /// Create a managed overlapped class // We will set the file offsets later Overlapped overlapped = new Overlapped(0, 0, IntPtr.Zero, asyncResult); //// Pack the Overlapped class, and store it in the async result NativeOverlapped intOverlapped; intOverlapped = overlapped.UnsafePack(null); Any help?Thanks
|
Pages: 1 Prev: update using sqldataadapter Next: Regression - Instruction |