Ste*_*rdi 6 c# c++ com serialization safearray
如何使用a Safearray
将一组自定义类型(一个只包含属性的类)从C++传递给C#?使用该VT_RECORD
类型的方法是正确的吗?
我正在尝试以下方式,但对类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; }
}
Run Code Online (Sandbox Code Playgroud)
未管理的世界:
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]++;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我可以使用它SafeArray
来传递BSTR
两个应用程序之间没有问题的其他数组.所以这是传递结构所特有的.
斯特凡诺
我不确定我是否正确理解你的问题,但也许你需要VT_DISPATCH
?我认为如果你希望它与 一起工作VT_RECORD
,那么你的结构实际上应该是一个结构(而不是类)并且还需要该[StructLayout(LayoutKind.Sequential)]
属性。
编辑:您首先遇到的错误可能是吗DISP_E_BADINDEX
?您的代码中到底有什么indices
?它包含什么?(你知道 的签名SafeArrayPutElement
要求它是一个指针,对吧?)
归档时间: |
|
查看次数: |
3993 次 |
最近记录: |