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?
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
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. –