1

我正在尝试在 C# 中创建一个 COM dll,它有一个代表图像的 byte[] 属性。这个想法是一位同事正在编写一个 C++ 应用程序,该应用程序将使用我的 dll 与相机接口。

我的 dll 成功地允许他的程序连接到相机,返回各种值,但创建的 SAFEARRAY 似乎不可读(他得到了一个长度数字,但无法读取其实际数据)。

  1. 在尝试以如下所示的方式将图像作为字节数组传递出去时,我是否在做一些愚蠢的事情?

  2. 我是否需要明确告诉 Visual Studio 使用特定的封送处理类型,而不是让它自己选择?

  3. 我是否也应该公开指向字节数组的指针,还是 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 的文档说这是“无法锁定安全数组”

4

0 回答 0