Seite 1 von 1

ActiveQt: dynamicCall() mit Rückgabeparametern

Verfasst: 14. Januar 2011 18:51
von XL
Hallo allerseits,

hat schon jemals jemand mit dynamicCall eine ActiveX-Methode aufgerufen, die Rückgabeparameter hat?

Laut Dokumentation müsste das doch funktionieren:

Code: Alles auswählen

QVariant QAxBase::dynamicCall ( const char * function, QList<QVariant> & vars )
This is an overloaded function.

Calls the COM object's method function, passing the parameters in vars, and returns the value returned by the method. If the method does not return a value or when the function call failed this function returns an invalid QVariant object.

The QVariant objects in vars are updated when the method has out-parameters.
Bei mir wird vars nicht beschrieben.

Auszug aus meinem Code:

Code: Alles auswählen

	bool bCommsOK = true;
	QVariant var1;
	var1.setValue(bCommsOK);
	QList<QVariant> listVars;
	listVars.clear();
	listVars.append(var1);
	motorPanel->dynamicCall("GetHWCommsOK(bool*)", listVars);
	bCommsOK = listVars.at(0).toBool();
Funktioniert nicht. Der Wert von bCommsOK wird nicht aktualisiert.
Liegt nicht an der speziellen Methode (GetHWCommsOK), bei anderen funktionierts auch nicht. Ohne Rückgabeparameter funktioniert alles einwandfrei.
Zum Verzweifeln ...

Verfasst: 15. Januar 2011 12:52
von solarix
Ich kenne mich mit ActiveX nicht aus und daher übersehe ich evt. irgendwas was fundamentales..
Allerdings fällt mir auf, dass du vermutlich den falschen Datentyp übergibtst: erwartet wird ein "bool*". Du jedoch übergibst mit "QVariant var1; var1.setValue(bCommsOK);" ein "bool".

Evtl. funktioniert es ja mit "QVariant var1 = qVariantFromValue(&bCommsOK)"?

hth..

Verfasst: 20. Januar 2011 16:58
von XL
Schönen Dank für die Antwort.
Das war es allerdings leider nicht, das hatte ich schon selbst ausprobiert und die Doku sagt ja auch
"The QVariant objects in vars are updated when the method has out-parameters."

Mittlerweile habe ich mich einmal durch die Tiefen des Source-Codes von dynamicCall() u.a. gekämpft und bin dabei auf die Stelle gestoßen an der entschieden wird, ob es sich um einen out-parameter, d.h. mit Rückgabe, handelt. Demnach ist die Schreibweise "bool*" in dem String der den Funktionsnamen angibt nicht richtig. Es müsste (wenn ich den Source-Code richtig interpretiere ...) entweder "bool&" oder "bool**" heißen. Dokumentiert ist das allerdings nicht und Beispiele findet man auch nicht. Und Googlelei liefert die gleiche/ähnliche Frage zwar noch 2-3 mal, aber jeweils ohne Lösungsantwort.
Und "bool&" funktioniert tatsächlich, hurra! Allerdings geht "bool**" anscheinend nicht.

Einige Werte auszulesen funktioniert damit nun. Bin ein bisschen stolz auf mich ... :-)

Allerdings habe ich nun noch ein weiteres Problem. Das ActiveX liefert laut Doku einen Wert vom Typ (Visual Basic) Single. Ich versuche den als Float zu lesen, aber kriege Bullshit zurück. Kann da jemand was zu sagen?
Nehme an, dass es ein Problem mit dem Datentyp ist, aber kann auch noch was mit dynamicCall sein.


PS Wie kann man einen Thread als [gelöst] kennzeichnen?

Verfasst: 20. Januar 2011 17:37
von padreigh
[gelöst] --> Einfach Titel des ersten Posts editieren :)
Rest, k.A., sorry.