COM указатель на структуру - PullRequest
0 голосов
/ 22 января 2010

Я использую Visual Studio 2008 / .NET 3.5. Я использовал VS, чтобы сделать COM-компонент совместимым в .NET. Я добавил ссылку из приложения в COM DLL. COM DLL является сторонним объектом - частью SDK.

Для всех методов и событий все работает просто отлично - объекты / события COM представлены в виде объектов / событий первого класса.

Вот что происходит:

Метод Scan () запускается. В конце своего выполнения он вызывает событие.

void scanner_ImageBuffer(int lStructure)
{
}

Аргумент - lStructure - согласно документации:

ImageBuffer( int lStructure )

Описание: событие ImageBuffer уведомит клиентское приложение о завершение сканирования и передать структура, содержащая ширину, высота, размер и буфер изображения изображение, которое было собрано как часть сканирование. Это ответственность клиентское приложение для освобождения память, которая была выделена для буфер изображения и освободить память для структуры. Это событие не может быть совместимым с Visual Basic Приложения. Параметры:

int lStructure - это 32-битный указатель в следующую структуру

struct _ImageBufferDef
{
    int lWidth;   // size of the image width in pixels
    int lHeight;  // size of the image height in pixels
    int lSize;    // size of the image in bytes
    unsigned short* pusBuffer;  // allocated memory containing image
}

Вот где я застрял: Как мне реконструировать объект только с INT


Я пробовал:

[StructLayout(LayoutKind.Sequential)]
struct ImageBufferDef
{
    int lWidth;
    int lHeight;
    int lSize;
    IntPtr pusBuffer;
}

void scanner_ImageBuffer( int lStructure )
{
    IntPtr ptr = new IntPtr( lStructure );

    ImageBufferDef buf = new ImageBufferDef();

    try
    {
        Marshal.PtrToStructure( ptr, buf );
    }
    catch( Exception e )
    {
        Console.WriteLine( e.Message );
    }
}

1 Ответ

0 голосов
/ 18 сентября 2014

Из-за

int lSize;    // size of the image in bytes
unsigned short* pusBuffer;  // allocated memory containing image

После

ImageBufferDef bufferDef = (ImageBufferDef)Marshal.PtrToStructure(ptr, typeof(ImageBufferDef));

Вы можете попробовать

short[] buffer = new short[bufferDef.lSize / 2];
Marshal.Copy(bufferDef.pusBuffer, buffer, 0, buffer.Length);

В случае, если вы измените тип массива buffer, будьте осторожны с его длиной и параметром Marshal.Copy length, так как первый должен учитывать размер элемента массива, равный 2 это short[], а второй нужен счетчик элементов массива вместо общего количества байтов.

...