【问题标题】:Marshalling an unsigned char * from a COM interface从 COM 接口编组 unsigned char *
【发布时间】:2012-12-31 12:59:37
【问题描述】:

我在 IPlan.idl 文件中定义了一个 COM 接口,该接口定义了 unsigned char* 缓冲区的属性。

[
    object,
    uuid(...),
    dual,
    helpstring("..."),
    pointer_default(unique)
]
interface IPlan : IDispatch
{
    ...
    [id(28), helpstring("method SetByte")
    HRESULT SetByte([in] long index, [in] unsigned char buffer);

    [id(29), helpstring("method GetByte")
    HRESULT GetByte([in] long index, [out, retval] unsigned char * pBuffer);

    [id(30), propget, helpstring("property Buffer")]
    HRESULT Buffer([out, retval] unsigned char** pBuffer);
    [id(30), propput, helpstring("property Buffer")]
    HRESULT Buffer([in] unsigned char* newBuffer);
    ...
}

我的实现类 MyPlan 是用 C# 定义的。此类与 C++ COM 类 CProcessor 对话。 CProcessor 将一些数据计算到一个 unsigned char* 缓冲区中。一旦 CProcessor 中的所有数据都存储在其缓冲区中,此数据就会加载到 MyPlan 对象中。

IPlan 的元数据定义了以下函数签名:

public interface IPlan
{
    ...
    byte GetByte(int index);
    void SetByte(int index, byte buffer);   
    IntPtr get_Buffer();
    void set_Buffer(ref byte pBuffer);
    ...
}

我可以使用 CProcessor 中的 GetByte 和 SetByte 来访问和修改 MyPlan 中的 byte[] 变量。我还可以通过编组 byte[] 变量来使用 get_Buffer()。

我的问题是如何使用

set_Buffer(ref byte pBuffer)

功能?当我在 CProcessor 中调用它时,pBuffer 只包含缓冲区的第一个字节(如对 SetByte(0, data) 的调用)。我假设我需要像在 getter 中那样编组 setter,但我的搜索结果是空的。我试过了

set_Buffer([MarshalAs(UnmanagedType.LPStr)] ref byte pBuffer);

但这似乎对传递整个数组没有任何作用。

MarshalAs(UnmanagedType.LPStr) - how does this convert utf-8 strings to char*

Problem using dll in c#

【问题讨论】:

    标签: visual-c++ com c#-2.0 idl


    【解决方案1】:

    我可以使用

    [id(1), propget, helpstring("Buffer")]
    HRESULT Buffer([out, retval] VARIANT* pBuffer);
    [id(1), propput, helpstring("Buffer")]
    HRESULT Buffer([in] VARIANT pBuffer);
    

    将无符号字符数组从 C++ 传递到 C#。 C# 只需要转换为 byte[]

    this.buffer = (byte[])myPlan.Buffer;
    

    【讨论】:

      猜你喜欢
      • 2011-04-29
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      • 2010-10-18
      • 2015-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多