指向struct的COM指针

时间:2010-01-22 19:44:09

标签: c# com interop struct

我正在使用Visual Studio 2008 / .NET 3.5。我使用VS在.NET中使COM组件可互操作。我从应用程序添加了对COM DLL的引用。 COM DLL是第三方对象 - SDK的一部分。

对于所有方法和事件,一切正常 - COM对象/事件表示为第一类.NET对象/事件。

以下是发生的事情:

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
}
  

这是我被困的地方:我该怎么做   仅使用a重建对象   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 :(得分:0)

因为

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[],第二个想要数组的元素数而不是总字节数。