От: | Relior | ||
Дата: | 09.06.10 21:10 | ||
Оценка: |
typedef struct
{
int width; //image width
int height; //image height
int info; //bit-count
usigned char* pbuf; //image buffer
} MY_IMAGE
int WT_ScanSelectBuf(void* image_down, void* image_up, int select)
MY_IMAGE m_Image0;
m_Image0.nWidth = m_nWidth;
m_Image0.nHeight = m_nLine;
m_Image0.nPxlFmt = m_PixelFormat;
m_Image0.pBuf = (UCHAR *)new UCHAR[m_nScanOption*nWidth*nHeight];
ret=WT_ScanSelectBuf(&m_Image0, NULL,option);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct SCAN_IMAGE
{
public int width;
public int height;
public int info;
[MarshalAs(UnmanagedType.LPStr)] //вот тут большие сомнения, но так мне показала
//сделать вот эта штука http://blogs.msdn.com/b/vbteam/archive/2008/03/14/making-pinvoke-easy.aspx
public string pbuf;
}
[DllImport("WNScanDll.dll")]
public static extern int WT_ScanSelectBuf(ref IntPtr image_down, ref IntPtr image_up, int select);
SCAN_IMAGE imageScan = new SCAN_IMAGE();
int imageWidth = 1600;
int imageHeight = 400; //rawImageSize / imageWidth; /////
imageScan.width = imageWidth;
imageScan.height = imageHeight;
imageScan.info = 0;
imageScan.pbuf = new string(new char[2 * imageWidth * imageHeight]);
IntPtr imageScanPtr = IntPtr.Zero;
int structSizeInBytes = Marshal.SizeOf(typeof(SCAN_IMAGE));
// выделить в куче буфер для нашей структуры
imageScanPtr = Marshal.AllocHGlobal(structSizeInBytes);
// скопировать .NET структуру в только что выделенный unmanaged кусок памяти
Marshal.StructureToPtr(imageScan, imageScanPtr, true);
IntPtr zero = IntPtr.Zero;
ret = Driver2010.WT_ScanSelectBuf(ref imageScanPtr, ref zero, 3);
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at MiniBank.Device.Scanner.WitekA4.Driver2010.WT_ScanSelectBuf(IntPtr& image_down, IntPtr& image_up, Int32 select)