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 SafeArrayPutElement Retorna um erro ao tentar preencher o SafeArray A referência à matriz de classes chega ao código gerenciado como um nulo.

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

Foi útil?

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?)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top