Frage zu ActiveQt

Alles rund um die Programmierung mit Qt
Antworten
PewPewLaser
Beiträge: 4
Registriert: 13. August 2009 14:59

Frage zu ActiveQt

Beitrag von PewPewLaser »

Hallo Liebe Forenmitglieder,

ich beschäftige mich erst seit wenigen Wochen mit Qt und hätte deshalb eine (oder mehrere) Frage(n) zu ActiveQt.

Mein Ziel ist es einen Microsoft Agenten in meine Qt Anwendung einzubauen, um beim Programmstart dem Benutzer eine Art der Hilfestellung zu gewährleisten.

Mein Problem ist es, dass ich zwar per dynamicCall das Dialogfenster öffnen kann, um den passenden Agenten auszuwählen (was nur ein Test ist), jedoch der Versuch den Agenten selbst anzuzeigen scheitert. Fehlermeldungen, Programmabstürze gibt es nicht.

Mein C++ Test-Code (in einem anderen Projekt, funktioniert alles wunderbar:

//Agent laden und anzeigen
axAgent1->Characters->Load("Merlin","C:\\WINDOWS\\msagent\\chars\\Merlin.acs");
axAgent1->Characters->Character("Merlin")->Show(false);
axAgent1->Characters->Character("Merlin")->Speak("Hallo wie geht es dir?","");
//Auswahlmenü für den Agenten
axAgent1->ShowDefaultCharacterProperties();

Relevanter Code in meinem Qt Projekt:

//Neues QAxObject
QAxObject *agent1 = new QAxObject(this);
//Microsoft Agent Control 2.0
agent1->setControl( "{D45FD31B-5C6E-11D1-9EC1-00C04FD7081F}" );
//Agenten laden
agent1->dynamicCall("Characters->Load(\"Merlin\",\"C:\\WINDOWS\\msagent\\chars\\Merlin.acs\")");
//Agenten anzeigen
agent1->dynamicCall("Characters->Character(\"Merlin\")->Show(false)");
//Auswahlmenü für den Agenten (funktioniert!)
agent1->dynamicCall("ShowDefaultCharacterProperties()");

Wie schon oben erwähnt, das Auswahlmenü erscheint, der Assistent leider nicht...
Meine Frage hierzu:
Befindet sich ein Syntaxfehler in meinem Code oder verfolge ich einen falschen Ansatz?
Wie könnte ich es besser machen?

Für aufschlussreiche Ideen bin ich sehr dankbar
Liebe Grüße
Laser :-)
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Warum show(false)? Muss das so sein?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

wuerd dir empfehlen, den Agenten und den Ablauf prototypmaessig erst mal in Visual Basic oder VBA (in word, excel oder access dabei) zu programmieren.
Das ist einfacher, komfortabler und weniger fehlerbehaftet.
Danach weisst dann haargenau, ob die COM Objecte so funktionieren wie du dir das vostellst ....
Danach wuerd ich das erst in ActiveQT uebernehmen ....

Was mir aufn ersten Blick aber auffaellt ... und wo ich mich frage ob das funktioniert ....
dynamicCall will den methodennamen, und danach die parameter einzeln als QVariant.
agent1->setControl( "{D45FD31B-5C6E-11D1-9EC1-00C04FD7081F}" );
welchen COM Typ setzt du damit ? schon "Characters" ???
"Characters->Load" sollte er als dynamic call schon gar ned aufloessen koennen ....

wenn agent1 schon deine COM "Characters" Instanz ist ... muss das Load beispielsweisse so aussehen
agent->dynamicCall("Load",QString("Merlin"),QString("C:\\WINDOWS\\msagent\\chars\\Merlin.acs"));

um von Characters auf Character zu kommen
QList<QVariant> mParams;
mParams.push_back(QString("Merlin"));
QAxObject * characters = agent->querySubObject("Character",mParams);


/// dann kannst das show aufrufen
characters->dynamicCall("show",QVariant(VARIANT_FALSE));

Hinweiss
COM arbeitet mit VARIANT Typen (COM VARIANT - also OLE Typen).
true und false sind C/C++ Konstanten
VARIANT_TRUE und VARIANT_FALSE sind die entsprechenden OLE Konstanten, die in windows definiert werden.

Iss aber scho ne weile her das ich mit QActive mal was gemacht habe ...

Ciao ....
Antworten