6

如何使用 aSafearray将一组自定义类型(仅包含属性的类)从 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这两个应用程序之间没有问题。所以这是传递结构所特有的。

斯特凡诺

4

1 回答 1

4

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

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

于 2009-06-15T08:02:21.103 回答