2009-06-25 1 views
2

Ich muss String-Listen zu nicht verwalteten C++ übergeben wie kann ich das tun?Wie zwei String-Listen an C++ übergeben von C# durch COM?

Ich habe IDictionary als Methode Rückgabetyp und senden über com, aber es funktioniert nicht. Wie erreiche ich das?

Was ich in C# geschrieben haben, ist wie folgt -

IDictionary<string,string> postNames() 
{ 
    IDictionary<string,string> post=Dictionary<string,string>(); 
    post.Add("Raj"); 
    post.Add("Mahesh"); 
    post.Add("john steek"); 

    return post; 
} 

Dann habe ich erstellt eine dll für diese Klasse diese Methode enthält.

Nun, wie kann ich diese Werte in nicht verwalteten C++ zugreifen kann ....

ich zwei Dinge besorgt bin

1) über den Rückgabetyp diese Werte in C++

2) zu tragen Ist es möglich, auf diese Weise zu verwenden.

Irgendwelche Hilfe in dieser Hinsicht?

+0

Nicht genug Informationen, denke ich. Ist das COM-Objekt/Interface bereits definiert oder erstellen Sie eine neue Methode dafür? – hythlodayr

+0

Welche Art von Liste ist das auf der C++ Seite? MFC CList? AWL-Liste? oder einfach nur ein Null-terminiertes Array? –

+0

Warum IDictionary? Ein Wörterbuch enthält ein Schlüssel/Wert-Element, aber Sie haben nur Schlüssel, keine Werte. Sie fügen nur Zeichenfolgen hinzu, es scheint sinnvoller, eine Zeichenfolge [] oder System.Array zurückzugeben. –

Antwort

1

Eine schnelle, dreckige Methode ist einen C++/CLI-Wrapper schreiben.

0

Es ist im Wesentlichen das gleiche Problem wie in this question. Sie können hier die perfekte Earwicker's answer implementieren - deklarieren Sie eine Reihe von Schnittstellen und Accessor-Klassen, die das Dictionary umhüllen und sie COM offen legen.

+0

Ich verwechsle mit dieser Lösung.Lösung von Workarounds dort. – Cute

0

Die einfachste Möglichkeit besteht darin, eine Zeichenfolge [] zu übergeben und sie in der nicht verwalteten Seite als SAFEARRAY (BSTR) -Typ zu verwenden. Sie können auch einen String [] und verbrauchen sie in COM als LPSTR [] durch die MarshalAs verwenden (dies ist die Probe auf MSDN) übergeben:

void FunctionCall([MarshalAs(UnmanagedType.LPARRAY, 
    ArraySubType= UnmanagedType.LPStr, SizeParamIndex=1)] 
    String [,] ar, int size); 

Siehe Default Marshaling for Arrays für weitere Details.