Passando um safearray de tipos personalizados de C ++ para C#
-
13-09-2019 - |
Pergunta
Como alguém pode usar um Safearray
Para passar uma variedade de tipos personalizados (uma classe que contém apenas propriedades) de C ++ para C#? Está usando o VT_RECORD
Digite a maneira certa de fazer isso?
Estou tentando da seguinte maneira, mas A referência à matriz de classes chega ao código gerenciado como um nulo.SafeArrayPutElement
Retorna um erro ao tentar preencher o SafeArray
Eu tenho algo como o seguinte no mundo gerenciado:
[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; }
}
Mundo não gerenciado:
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]++;
}
Por favor, observe que eu sou capaz de usar o SafeArray
para passar outras matrizes de BSTR
sem problemas entre os dois aplicativos. Portanto, isso é algo peculiar para passar uma estrutura.
Stefano
Solução
Não tenho muita certeza se entendi sua pergunta corretamente, mas talvez você precise VT_DISPATCH
? Eu acho que se você quiser que funcione VT_RECORD
, então sua estrutura deve ser realmente uma estrutura (não uma classe) e também precisa do [StructLayout(LayoutKind.Sequential)]
atributo.
Editar: Pode ser que o erro que você comeu foi DISP_E_BADINDEX
? O que exatamente é indices
no seu código? O que contém? (Você sabe que a assinatura de SafeArrayPutElement
Requer que seja um ponteiro, certo?)