2009-06-15 36 views
5

如何使用Safearray将自定义类型数组(仅包含属性的类)从C++传递到C#?正在使用VT_RECORD类型正确的方式来做到这一点?将自定义类型的Safearray从C++传递到C#

我正在尝试以下方式,但 SafeArrayPutElement尝试填充safearray时返回错误 对类数组的引用以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其他阵列两个应用程序之间的问题。所以这是传递结构特有的东西。

斯特凡诺

+0

什么是错误? – fretje 2009-06-15 07:56:30

回答

3

我真的不知道,如果我明白你的问题的权利,但也许你需要VT_DISPATCH? 我想如果你想要它与VT_RECORD一起工作,那么你的结构实际上应该是一个结构(不是类),也需要[StructLayout(LayoutKind.Sequential)]属性。

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

+0

任何可以完成工作的事情都可以与我一起;) 仅从名称判断,VT_RECORD似乎是我正在尝试完成的最接近的选项。我只需要能够将这个结构/类暴露给非托管代码来填充它。 – 2009-06-15 08:30:15

+0

您可以详细说明您的当前解决方案如何完全失败?一个错误消息可能? – fretje 2009-06-15 08:49:19

+0

*详细说明课程;-) – fretje 2009-06-15 08:49:50