2009-06-15 17 views
5

¿cómo se puede usar un Safearray para pasar una matriz de tipos personalizados (una clase que contiene solo propiedades) de C++ a C#? ¿Está utilizando el VT_RECORD la forma correcta de hacerlo?Pasar un Safearray de tipos personalizados de C++ a C#

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

mundo no administrado:

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. Entonces esto es algo peculiar para pasar una estructura.

Stefano

+0

¿Cuál es el error? – fretje

Respuesta

3

No estoy realmente seguro si entiendo su pregunta correcta, pero tal vez necesito VT_DISPATCH? Creo que si quieres que funcione con VT_RECORD, entonces tu estructura debería ser realmente una estructura (no una clase) y también necesita el atributo [StructLayout(LayoutKind.Sequential)].

Editar: ¿Puede ser que el error que recibió por primera vez fue DISP_E_BADINDEX? ¿Qué es exactamente indices en su código? ¿Qué contiene? (Usted sabe que la firma de SafeArrayPutElement requiere que sea un puntero, ¿no?)

+0

Todo lo que hace el trabajo está bien conmigo;) Juzgando solo por el nombre, VT_RECORD parecía ser la opción más cercana a lo que estoy tratando de lograr. Solo necesito poder exponer esta estructura/clase al código no administrado para llenarlo. –

+0

¿Puede explicar cómo su solución actual falla exactamente? Un mensaje de error tal vez? – fretje

+0

* elaborado fuera de curso ;-) – fretje

Cuestiones relacionadas