2010-01-22 119 views
0

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

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

这里是发生了什么事:

的扫描()方法运行。在执行结束时,会引发一个事件。

void scanner_ImageBuffer(int lStructure) 
{ 
} 

的参数 - lStructure - 根据文档是:

ImageBuffer(int lStructure) 

描述:ImageBuffer的事件 将通知的 扫描的完成客户端应用程序,并通过一个 结构包含作为 扫描的一部分收集的 图像的高度,大小和图像缓冲区的宽度, 。客户端应用程序有责任释放分配给 图像缓冲区的 内存,并释放该结构的内存 。此事件可能不与 应用程序兼容。参数:

的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); 
    } 
} 
+0

当你调用'Marhsal.PtrToStructure()'时发生了什么?它会抛出异常还是返回ImageBufferDef充满垃圾? – cmw 2010-01-22 20:17:34

+0

引发异常。但是,这是工作:ImageBufferDef bufferDef = (ImageBufferDef) Marshal.PtrToStructure(ptr, typeof(ImageBufferDef)); 我该如何获得嵌套的IntPtr pusBuffer? – Jason 2010-01-22 22:07:30

+0

如何在评论中突出显示代码? – Jason 2010-01-22 22:08:17

回答

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.Copylength参数,这是因为首先要考虑到数组元素大小即是它的一个short[] ,第二个想要数组的元素数而不是总字节数。