2009-06-15 8 views
5

Wie kann man ein Safearray verwenden, um ein Array von benutzerdefinierten Typen (eine Klasse, die nur Eigenschaften enthält) von C++ an C# übergeben? Verwenden Sie den VT_RECORD Typ den richtigen Weg, es zu tun?Übergeben eines Safearray von benutzerdefinierten Typen von C++ zu C#

ich in der folgenden Art und Weise bin versucht, aber SafeArrayPutElement gibt einen Fehler beim Versuch, die Safearray die Referenz auf das Array von Klassen an den verwalteten Code als NULL wird zu füllen.

Ich habe so etwas wie die folgenden in der verwalteten Welt:

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

Unmanaged Welt:

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

Bitte beachten Sie, dass die ich bin in der Lage verwenden die SafeArray andere Anordnungen von BSTR mit nicht passieren Probleme zwischen den beiden Anwendungen. Das ist etwas, was dem Übergeben einer Struktur eigen ist.

Stefano

+0

Was ist der Fehler? – fretje

Antwort

3

Ich bin nicht wirklich sicher, ob ich verstehe Ihre Frage richtig, aber vielleicht brauchen Sie VT_DISPATCH? Ich denke, wenn Sie möchten, dass es mit VT_RECORD arbeitet, dann sollte Ihre Struktur eigentlich eine Struktur (keine Klasse) sein und benötigt auch das [StructLayout(LayoutKind.Sequential)] Attribut.

Bearbeiten: Kann es sein, dass der Fehler, den Sie zuerst bekommen haben, DISP_E_BADINDEX war? Was genau ist indices in Ihrem Code? Was enthält es? (Sie wissen, dass die Signatur von SafeArrayPutElement erfordert, dass es ein Zeiger ist, richtig?)

+0

Alles, was die Arbeit erledigt, ist ok mit mir;) Judd nur vom Namen, schien VT_RECORD am nächsten zu sein, was ich versuche zu erreichen. Ich muss nur in der Lage sein, diese Struktur/Klasse dem nicht verwalteten Code zur Verfügung zu stellen, um sie zu füllen. –

+0

Können Sie sich darüber informieren, WIE Ihre aktuelle Lösung genau fehlschlägt? Eine Fehlermeldung vielleicht? – fretje

+0

* komplizierter Kurs ;-) – fretje