我正在尝试在 C# 中创建一个 COM dll,它有一个代表图像的 byte[] 属性。这个想法是一位同事正在编写一个 C++ 应用程序,该应用程序将使用我的 dll 与相机接口。
我的 dll 成功地允许他的程序连接到相机,返回各种值,但创建的 SAFEARRAY 似乎不可读(他得到了一个长度数字,但无法读取其实际数据)。
在尝试以如下所示的方式将图像作为字节数组传递出去时,我是否在做一些愚蠢的事情?
我是否需要明确告诉 Visual Studio 使用特定的封送处理类型,而不是让它自己选择?
我是否也应该公开指向字节数组的指针,还是 SAFEARRAY 结构会处理这个问题。
我只使用 C# 几个月,这是我第一次编写 COM dll,如果我遗漏了一些明显的东西,请多多包涵。我一直在假设问题 1 不是问题的前提下工作,因为单独的 C# 测试应用程序可以成功地重建图像。
类(摘录):
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
public class ResultInfo : IResult
{
public byte[] ImageBytes
{
get
{
MemoryStream ms = new MemoryStream();
this.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] returnBytes = ms.ToArray();
ms.Close();
return returnBytes;
}
}
}
接口(摘录):
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IResult
{
[DispId(5)]
byte[] ImageBytes { get; }
}
编辑:这是 C++ 方面的输出:
当我尝试使用 HRESULT hr = SafeArrayAccessData (image, &data) 访问 SAFEARRAY 时;返回的 hr 是 E_UNEXPECTED - SafeArrayAccessData 的文档说这是“无法锁定安全数组”