2009-06-15 12 views
5

jak można użyć Safearray do przekazania tablicy typów niestandardowych (klasa zawierająca tylko właściwości) z C++ na C#? Czy używasz typu VT_RECORD we właściwy sposób?Przekazywanie Safearray typów niestandardowych z C++ do C#

Próbuję w następujący sposób, ale SafeArrayPutElement zwraca błąd, gdy próbuje wypełnić safearray odniesienia do tablicy klas dostaje się do zarządzanego kodu jako NULL.

Mam coś jak następujące w zarządzanym świata:

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

niezarządzalny świat:

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

Należy pamiętać, że jestem w stanie Użyj SafeArray przekazać inne tablice z BSTR bez problemy między tymi dwoma aplikacjami. Jest to więc coś charakterystycznego dla przekazywania struktury.

Stefano

+0

Jaki jest błąd? – fretje

Odpowiedz

3

Nie jestem pewien, czy rozumiem pytanie rację, ale może trzeba VT_DISPATCH? Myślę, że jeśli chcesz, aby działało z VT_RECORD, to twoja struktura powinna w rzeczywistości być strukturą (nie klasą), a także potrzebować atrybutu [StructLayout(LayoutKind.Sequential)].

Edytuj: Czy to możliwe, że błąd, który otrzymałeś, był DISP_E_BADINDEX? Czym dokładnie jest indices w twoim kodzie? Co zawiera? (Wiesz, że podpis SafeArrayPutElement wymaga, aby był wskaźnikiem, prawda?)

+0

Wszystko, co się wykonuje, jest ze mną w porządku;) Juddging tylko od imienia, VT_RECORD wydawał się być najbliższą opcją tego, co próbuję osiągnąć. Po prostu potrzebuję móc odsłonić tę strukturę/klasę do niezarządzanego kodu, aby ją wypełnić. –

+0

Czy możesz omówić, W JAKI SPOSÓB obecne rozwiązanie dokładnie zawodzi? Być może komunikat o błędzie? – fretje

+0

* opracowanie kursu ;-) – fretje

Powiązane problemy