[Qt][Windows][Résolu] QVariant et ActiveX

Salut à tous !

Je suis en train de développer une interface Qt pour une application. J’ai réussi à résoudre les problèmes rencontrés (importer des fonctions d’une DLL, communiquer le handle d’un widget, gérer les messages Windows, utiliser des ActiveX), je bloque sur un (problème) qui est particulièrement coriace.

Je vais essayer de faire simple :
J’ai une fonction ForthGetValue, importé de ma DLL, qui prend une QString (char * en fait) et un int*.
En pratique, je l’appelle pour avoir un pointeur sur un variant, que je veux transmettre à un ActiveX.

Voici un exemple que l’on m’a donné en Delphi (et qui marche) :
Code : Delphi

var
  v:^variant;             		// Définition d'un pointeur sur variant
  add:integer;                    // Définition d'un entier
begin
    ForthGetValue('MyData',add);  // Appel de ForthGetValue, qui renvoie
                                    // dans add l'adresse du Variant relatif
                                    // à MyData (c'est l'adresse de add qui
                                    // est transmise !)
    v:=pointer(add);              // On fait pointer v sur l'adresse
                                    // renvoyée dans add
    CWGraph1.PlotY(v^);   		// On appelle l'ActiveX qui dessine le
                                  // graph pointé par v
end;

J’ai donc essayé de le traduire en C++ avec Qt, et j’ai tenté quelque chose comme ca :
Code : C++

    QVariant *v = new QVariant();
    int add;

    forth->ForthGetValue("MyData",&add);
    v->fromValue(add);      // Mon variant doit prendre l'adresse dans add
    coupeNI->dynamicCall("PlotY(const QVariant)",*v);

Et bien sûr, cela ne marche pas. Je pense que le problème vient de v->fromValue(add); qui ne fait pas ce que je veux.

Les valeurs données par le désinsectiseur (debugger) sont catégoriques :
(int) add = VALEUR
(QVariant) v = 0xVALEUR
(QVariant) v* = (invalid)

J’espère que mon problème est clair et que quelqu’un pourra m’aider

P.S. : Précision : à cause des problèmes ci-dessus, lors de l’appel à l’activeX, il me répond poliment que : “QAxBase: Error calling IDispatch member PlotY: Type mismatch in parameter 0”

Bon, j’avoue que je n’ai pas trop regardé en détail ton problème, par contre il me semble que QVariant::fromValue(const T& value) est une méthode statique…
Donc, l’instruction “v->fromValue(add);” ne modifie en rien l’état de v.
Je pense que ce que tu veux faire c’est plutôt “v->setValue(add);”

Suite au test du setValue, j’obtient un graph qui ne correspond pas au ce qu’il faut : il s’agit en fait d’un graph d’une seule valeur, correspondant à la valeur décimale de l’adresse du variant que je cherche.

J’ai donc modifié mon code en :

    QVariant *v = new QVariant();
    int add;
    ForthGetValue("essai",&add);
    v=(QVariant*)add;
    coupeNI->dynamicCall("PlotY(const QVariant)",*v);

Du coup, mon QVariant pointe sur le variant que je recherche. Et du coup, il y à un problème de type.
Donc comment récupérer les données du variant pointé au sein d’un QVariant (ou utiliser un variant simple dans dynamicCall) ?

Bon, j’ai finalement réussi en utilisant des fonctions perdues dans les méandres de Qt.

Il existe, si on include ActiveQt, une fonction non documentée (qui fait 56 hits sur Google au moment de la rédaction de ce message) qui permet de convertir un VARIANT en QVariant, donc utiliser par la suite dynamicCall.

Voici la ligne manquante à ce qui précède pour avoir quelque chose qui marche :
*qv = VARIANTToQVariant(v1, 0);

Bon bah, un problème de moins !

Merci en tout cas pour les idées, ça m’a fait avancer.