Pregunta

¿cómo se puede utilizar un Safearray a pasar una matriz de tipos personalizados (una clase que contenga sólo las propiedades) de C ++ a C #? Se utiliza el tipo de VT_RECORD la forma correcta de hacerlo?

Estoy tratando de la siguiente manera, pero SafeArrayPutElement devuelve un error al intentar llenar el safearray la referencia a la variedad de clases llega al código administrado como NULL.

Tengo algo como lo siguiente en el mundo administrado:

[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; } 
}

No administrado mundo:

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]++;
}

Tenga en cuenta que la opción Soy capaz de utilizar la SafeArray pase a otras matrices de BSTR sin problemas entre las dos aplicaciones. Así que esto es algo peculiar de pasar una estructura.

Stefano

¿Fue útil?

Solución

No estoy realmente seguro si entiendo su pregunta correcta, pero tal vez hace falta que le VT_DISPATCH? Creo que si se quiere que funcione con VT_RECORD, a continuación, su estructura debería ser en realidad una estructura (no una clase) y también necesita el atributo [StructLayout(LayoutKind.Sequential)].

Editar : ¿Puede ser que el error que tienes primero fue DISP_E_BADINDEX? Lo que se indices exactamente en el código? ¿Qué contiene? (Usted sabe que la firma de SafeArrayPutElement requiere que sea un puntero , ¿verdad?)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top