Передача SafeArray из пользовательских типов от C ++ до C#
-
13-09-2019 - |
Вопрос
Как можно использовать 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
требует, чтобы это было указателем, верно?)