将自定义类型的Safearray从C++传递到C#
问题描述:
如何使用Safearray
将自定义类型数组(仅包含属性的类)从C++传递到C#?正在使用VT_RECORD
类型正确的方式来做到这一点?将自定义类型的Safearray从C++传递到C#
我正在尝试以下方式,但
对类数组的引用以NULL的形式获取到托管代码。SafeArrayPutElement
尝试填充safearray时返回错误
我有一些像在管理世界如下:
[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
其他阵列两个应用程序之间的问题。所以这是传递结构特有的东西。
斯特凡诺
答
我真的不知道,如果我明白你的问题的权利,但也许你需要VT_DISPATCH
? 我想如果你想要它与VT_RECORD
一起工作,那么你的结构实际上应该是一个结构(不是类),也需要[StructLayout(LayoutKind.Sequential)]
属性。
编辑:它可以是你第一次得到的错误是DISP_E_BADINDEX
?你的代码中究竟是什么indices
?它包含什么? (你知道SafeArrayPutElement
的签名要求它是一个指针,对吗?)
什么是错误? – fretje 2009-06-15 07:56:30