【问题标题】:Passing a Safearray of custom types from C++ to C#将自定义类型的 Safearray 从 C++ 传递到 C#
【发布时间】:2010-11-02 22:53:54
【问题描述】:

如何使用Safearray 将一组自定义类型(仅包含属性的类)从 C++ 传递到 C#?使用VT_RECORD 类型是否正确?

我正在尝试以下方式,但是 SafeArrayPutElement 在尝试填充安全数组时返回错误对类数组的引用作为 NULL 获取到托管代码。

我在托管世界中有以下类似的东西:

[ComVisible(true)]
public interface IStatistics
{
    double Mean { get; set; } 
    double StdDev { get; set; } 
}

[Serializable]
[ComVisible(true)]
public class Statistics : IStatistics
{
    public Mean { get; set; }
    public double StdDev { get; set; } 
}

非托管世界:

HRESULT hr = CoInitialize(NULL);
...
SAFEARRAY *pEquationsStatistics;

// common dimensions for all arrays
SAFEARRAYBOUND dimensions[1];  
dimensions[0].cElements = 2;   
dimensions[0].lLbound = 0;    

pEquationsStatistics = SafeArrayCreate(VT_RECORD, 1, dimensions);
...

for (long i = 0; i < dimensions[0].cElements; i++)
{
    long indices[1];
    indices[0] = 0;

    ... 

    // Equation statistics
    IStatisticsPtr pIStatistics(__uuidof(Statistics)); 
    pIStatistics->PutMean(1.0); // so far so good

    result = SafeArrayPutElement(pEquationsStatistics, indices, pIStatistics);

    ...
    indices[0]++;
}

请注意,我可以使用SafeArray 传递BSTR 的其他数组,这两个应用程序之间没有问题。所以这是传递结构所特有的。

斯特凡诺

【问题讨论】:

    标签: c# c++ com serialization safearray


    【解决方案1】:

    我不确定我是否理解您的问题,但也许您需要VT_DISPATCH? 我认为如果您希望它与VT_RECORD 一起使用,那么您的结构实际上应该是一个结构(而不​​是类)并且还需要[StructLayout(LayoutKind.Sequential)] 属性。

    编辑:会不会是你第一次得到的错误是DISP_E_BADINDEX?您的代码中的 indices 到底是什么?它包含什么? (你知道SafeArrayPutElement的签名要求它是一个指针,对吧?)

    【讨论】:

    • 任何可以完成工作的事情对我来说都可以;) 仅从名称来看,VT_RECORD 似乎是最接近我想要完成的选项。我只需要能够将此结构/类公开给非托管代码即可填充它。
    • 您能否详细说明您当前的解决方案是如何失败的?可能是错误消息?
    • 当我发布这个问题时,我从 SafeArrayPutElement 得到一个负返回值。由于某种原因,这不再发生(不确定是什么原因造成的,也许喷射另一个清洁/重建周期?);现在,当我运行调试器并进入托管代码时,对类的引用(我通过 API 传递)似乎为 NULL。
    • 其实类数组的引用是空的。
    • 我在代码中添加了更多上下文。请注意,在 for 循环中,我能够成功填充并传递给托管代码 2 字符串数组。这只是对我不起作用的类数组。谢谢您的帮助! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 2011-08-06
    • 1970-01-01
    相关资源
    最近更新 更多