COM指针结构
问题描述:
我正在使用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);
}
}
答
由于
的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
参数,这是因为首先要考虑到数组元素大小即是它的一个short[]
,第二个想要数组的元素数而不是总字节数。
当你调用'Marhsal.PtrToStructure()'时发生了什么?它会抛出异常还是返回ImageBufferDef充满垃圾? – cmw 2010-01-22 20:17:34
引发异常。但是,这是工作:
ImageBufferDef bufferDef = (ImageBufferDef) Marshal.PtrToStructure(ptr, typeof(ImageBufferDef));
我该如何获得嵌套的IntPtr pusBuffer? – Jason 2010-01-22 22:07:30如何在评论中突出显示代码? – Jason 2010-01-22 22:08:17