C++ --> C#
От: 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);




Структура на C#:

[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;
}



Объвления метода C#:

[DllImport("WNScanDll.dll")]
public static extern int WT_ScanSelectBuf(ref IntPtr image_down, ref IntPtr image_up, int select);




Использование на C#:

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)

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.