Передача SafeArray из пользовательских типов от C ++ до C#

StackOverflow https://stackoverflow.com/questions/994907

Вопрос

Как можно использовать Safearray Передают множество пользовательских типов (класс, содержащий только свойства) от C ++ до C#? Использует VT_RECORD введите правильный способ сделать это?

Я стараюсь следующим образом, но 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 требует, чтобы это было указателем, верно?)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top