2016-05-12 24 views
0

I, mit COM, eine Funktion mit der folgenden Signatur nennen wollen:Array Passing als out-Parameter von C# COM mit

void GetCompoundList(ref object compIds, ref object formulae, ref object names, ref object boilTemps, ref object molwts, ref object casnos) 

Ich habe keinen Zugriff auf die Implementierung, sondern die Objekte sind von Variant-Typ enthalten, SafeArrays von String und Double, und sind alle Out-Parameter.

Hier ist, wie ich die Arrays deklarieren und rufen Sie die Funktion:

Array thermoCompounds = null; 
Array thermoCompFormulae = null; 
Array thermoCompName = null; 
Array thermoCompTemp = null; 
Array thermoCompWei = null; 
Array thermoCompCAS = null; 

ppThermoComp.GetCompoundList(thermoCompounds, thermoCompFormulae, thermoCompName, thermoCompTemp, thermoCompWei, thermoCompCAS); 

Wo ppThermoComp eine Instanz der Klasse ist die Umsetzung der Schnittstelle.

Der Funktionsaufruf hat jedoch keine Auswirkung: Die Arrays sind immer noch null nach dem Anruf.

  • Wenn ich die Arrays in der richtigen Größe zu initialisieren, keine Änderung: Die Funktion hat keine Wirkung entweder
  • wenn ich eine andere Funktion aus der gleichen COM-Schnittstelle mit unterschiedlichen Argumenten aufrufen (beispielsweise ein Array, das zurückgeführt wird), es
  • funktioniert, wenn ich diese Funktion von einem C++ Code aufrufen (noch über COM), funktioniert es

C++:

CComVariant cIdsM, cFormulaeM, cNamesM, cTempM, cWeiM, cCASM; 
HRESULT hr = thermocompoundsMat->GetCompoundList(&cIdsM, &cFormulaeM, &cNamesM, &cTempM, &cWeiM, &cCASM); 

Irgendeine Idee, was ist falsch an meinem C# -Code?

+0

Ich bin verwirrt - die Dokumentation sagt "Um einen Ref-Parameter zu verwenden, müssen sowohl die Methodendefinition als auch die aufrufende Methode explizit das Schlüsselwort ref verwenden, wie im folgenden Beispiel gezeigt." aber Ihr C# -Code nicht. Kompiliert es Ok? – PhillipH

+0

Eine Variante ist nicht Array. Übergeben Sie stattdessen eine Variable von * object *, umwandeln Sie anschließend den erwarteten Array-Typ. Und den Autor anpingen, sollte er einen Fehler HRESULT zurückgegeben haben, um Ihnen zu sagen, dass das Argument falsch war. –

Antwort

0

Danke Philip und Hans. Eigentlich musste ich nach deinen 2 Kommentaren modifizieren um den Code zu beheben.

object thermoCompounds = null; 
object thermoCompFormulae = null; 
object thermoCompName = null; 
object thermoCompTemp = null; 
object thermoCompWei = null; 
object thermoCompCAS = null; 

ppThermoComp.GetCompoundList(ref thermoCompounds, ref thermoCompFormulae, ref thermoCompName, ref thermoCompTemp, ref thermoCompWei, ref thermoCompCAS); 

habe ich versucht, jeden (Objekt und ref), bevor die Frage zu stellen, sondern separat ...

By the way, kompiliert den Array-Typen vorbei, ohne den ref, aber nicht mit dem Ref Schlüsselwort, wahrscheinlich weil ein Array bereits eine Referenz ist.