ActiveX -> ActiveQt Probleme mit dynamicCall()

Alles rund um die Programmierung mit Qt
Antworten
goofy
Beiträge: 38
Registriert: 4. April 2006 15:40

ActiveX -> ActiveQt Probleme mit dynamicCall()

Beitrag von goofy »

Hallo,

bin noch nicht so viel ahnung von qt! leider ....

Hab ein Problem mit ActiveX bzw. mit ActiveQt und
der Methode dynamicCall().

Hab ein ActiveX-Control einer Kamera, es gibt leider keine andere Möglichkeit.
So Dinge wie play() oder stop() über dynamicCall() aufzurufen sind kein
Problem.
Jetzt benötige ich einen Aufruf über dynamicCall() bei dem ein Pointer übergeben wird und das "Ergebnis" dann wieder in diesem Paramter steht.

Code: Alles auswählen

long theFormat = 0;
long *theBufferSize = new long();
QVariant m_ImageBuffer = new QVariant();

activeX->dynamicCall("GetCurrentImage(long theFormat, VARIANT*
                                  theBuffer, long* theBufferSize)",
                                  theFormat, m_ImageBuffer, theBufferSize);
Laut Doku des ActiveX-Control werden in
- m_ImageBuffer die Bilddaten geschrieben
und in
- theBufferSize die Größe

Problem: es steh nix drin :cry:

tu jetzt seit ein paar tagen qt rum und jetzt bin ich an die grenzen gestoßen.

geht das überhaupt mit dynamicCall() einen Pointer oder Referenz zu übergeben und im Parameter wieder das Ergebnis zu haben?

Hab schon die Qt-Doku gelesen und versteh erstens nicht alles und zweitens wird nicht auf dieses Problem eingegangen!

thx

Goofy
goofy
Beiträge: 38
Registriert: 4. April 2006 15:40

Beitrag von goofy »

Hallo zusammen,

scheint so, dass mein "kleines" Problem sehr spezifisch ist.

Mittlerweile hab ich heraus gefunden oder besser gesagt gestern über sehen :oops: , dass der Methode dynamicCall() nur const Parameter übergeben werden dürfen.

Syntax:

Code: Alles auswählen

QVariant dynamicCall ( const char * function,
                                            const QVariant & var1 = QVariant(),
                                            const QVariant & var2 = QVariant(),
                                            const QVariant & var3 = QVariant(),
                                            const QVariant & var4 = QVariant(),
                                            const QVariant & var5 = QVariant(),
                                            const QVariant & var6 = QVariant(),
                                            const QVariant & var7 = QVariant(),
                                            const QVariant & var8 = QVariant() )
es gibt noch eine andere Möglichkeit für den dynamicCall() Aufruf:

Code: Alles auswählen

QVariant dynamicCall ( const char * function, QList<QVariant> & vars )
Man übergibt einfach eine QList, mit den benötigten Parameter.
Allerdings kann man in eine QList auch nur wieder const Elemente anhängen oder einfügen.

Glaub langsam, dass dieses Problem nicht wirklich lösbar ist.

Oder kennst sich vielleicht jemand mit dem ActiveQt bzw QAxBase oder QAxWidget aus?

Würde mir sehr weiterhelfen!

thx

Goofy
goofy
Beiträge: 38
Registriert: 4. April 2006 15:40

Beitrag von goofy »

Und nochmal Hallo ...

Also werd immer schlauer irgendwelche COM-Objekte oder ActiveX-Conrtols zu verwenden oder einzufügen.

Es gibt da noch eine andere Möglichkeit

queryInterface()

Laut Qt-Doku ist das sogar effizienter als dynamicCall()

Aber leider habe ich in der Qt-Doku keine wirklich hilfreichen Erklärungen (vielleicht auch Verständnis-Schwierigkeiten meinerseits) oder Beispiele gefunden.
Es wird nur kurz darauf eingegangen.

Hat vielleicht jemand ein bischen Ahnung von dem Zeug?
ein kleines Beispiel, möglichst komplett damit ich verstehe woher die ganzen Variablen kommen ...
Oder gibts ein anderes Forum oder Seite wo diese Dinge erklärt werden?

Wäre sehr hilfreich!

thx

Goofy
goofy
Beiträge: 38
Registriert: 4. April 2006 15:40

Beitrag von goofy »

Hallo,

schade dass mir keiner weiter helfen kann, daher denke ich man kann diesen
Thread schließen.

Hab noch ein paar Sachen heraus gefunden. Versuch das mal kurz und etwas versändlich, für alle Interessierten oder für welche, die das gleiche Problem haben, zusammen zufassen.

zu Qt:
Von Qt wird ein Framework zur Verfügung gestellt ActiveQt mit dem relativ einfach COM-Objekte oder ActiveX Controls verwendet werden können.

Für ActiveX Controls gibt es QAxWidget, dort wird einfach mit die Methode
setControl() die CLSID (Class Identifier) übergeben. Dann können alle Methoden des ActiveX Controls über dynmicCall() ausgeführt werden.
Leider aber nicht solche die Out-Parameter haben, da nur const Paramter übergeben werden.

zu COM und ActiveX:
Microsoft COM Objekte sind ne ganz nette Sache, auch wenns von MS ist ...
Der Gedankte dahinter ist, zur Laufzeit Objekte auszutauschen.
COM - Component Object Model
ActiveX Controls sind auch COM Objekte
COM Objekte bestehen aus einzelnen Interfaces um ein solches Interface verwenden zu können, holt man sich dieses Interface mit QueryInterface(). Diese Methode wird auch von ActiveQt bereitgestellt.

und wieder bei Qt:
Hat man allerdings nur eine DLL kann man nur über dynamicCall() tolle Sachen machen. Für QAxBase::queryInterface(...) benötigt man die passende COM-Interface-Klasse.
Auch dafür hat Qt eine Lösung ein kleines Tool dumpccp, das mittels der CLSID oder dem Dateinamen diese Interface-Klasse erstellt abgestimmt auf Qt. (hat bei mir leider nicht funktioniert :( )
Falls die Doku des COM-Objekts oder ActiveX Controls nicht vorhanden ist oder nix bringt gibt es dann noch dumpdoc.
Hiermit lassen sich kleine Dokus für die Sachen erstellen, d.h. es man sieht wie die Methoden über dynamicCall() aufgerufen werden sollten.

soviel dazu!

Grüße

Goofy
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Was sagen denn die Trolls zu deinem Problem? Gerade im Bezug ActiveX haben die mir schon einige Male geholfen.
goofy
Beiträge: 38
Registriert: 4. April 2006 15:40

Beitrag von goofy »

Hallo,

an die Trolls hab ich mich noch nicht gewendet. Allerdings ist das Problem nicht mehr so present.

Mittlerweile haben sich Möglichkeiten in eine andere Richtung ergeben.

Mein Problem war ja nur das aktuelle Bild des ActiveX Controls zubekommen.
So wie es gerade aussieht brauch ich das Bild garnicht mehr.

Aber falls doch werd ich die Trolls mal fragen.

Thx

Goofy
Antworten