我正在使用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 );
}
}
答案 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[]
,第二个想要数组的元素数而不是总字节数。