2009-06-15 8 views
5

come è possibile utilizzare uno Safearray per passare una matrice di tipi personalizzati (una classe contenente solo proprietà) da C++ a C#? Sta usando il VT_RECORD tipo il modo giusto per farlo?Passaggio di un Safearray di tipi personalizzati da C++ a C#

sto cercando in questo modo, ma SafeArrayPutElement restituisce un errore quando si cerca di riempire il SAFEARRAY il riferimento alla matrice di classi arriva al codice gestito come un valore NULL.

ho qualcosa di simile al seguente nel mondo gestito:

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

mondo non gestito:

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

Si prega di notare che l'io sono in grado di utilizzare il SafeArray di passare altri array di BSTR senza problemi tra le due applicazioni. Quindi questo è qualcosa di peculiare al passaggio di una struttura.

Stefano

+0

Qual è l'errore? – fretje

risposta

3

Io non sono davvero sicuro se ho capito la tua domanda giusta, ma forse hai bisogno VT_DISPATCH? Penso che se vuoi che funzioni con VT_RECORD, la tua struct dovrebbe in realtà essere una struct (non una classe) e ha anche bisogno dell'attributo [StructLayout(LayoutKind.Sequential)].

Modifica: È possibile che l'errore riscontrato sia stato DISP_E_BADINDEX? Che cosa è esattamente indices nel tuo codice? Cosa contiene? (Sai che la firma di SafeArrayPutElement richiede che sia un puntatore, giusto?)

+0

Tutto quello che ottiene il lavoro è ok con me;) Giudicando solo dal nome, VT_RECORD sembrava essere l'opzione più vicina a ciò che sto cercando di realizzare. Devo solo essere in grado di esporre questa struttura/classe al codice non gestito per popolarlo. –

+0

Puoi sapere come la tua attuale soluzione fallisce esattamente? Forse un messaggio di errore? – fretje

+0

* elaborato fuori rotta ;-) – fretje

Problemi correlati