[VC++] Utilisation de VARIANT

Utilisation de VARIANT [VC++] - C++ - Programmation

Marsh Posté le 20-05-2003 à 14:43:59    

Bon, j'arrete de polluer Blabla avec ca...
Voilà le pb:
 
J'utilise un activeX qui me permet d'utiliser une fonction définie comme ceci:

Code :
  1. long CGear::AreaGet(long X1, long Y1, long X2, long Y2, VARIANT* pData, long Format)


 
Je n'ai malheureusement pas de doc VC++ pour ce composant, je n'ai que la doc pour VB, et je dois donc plus ou moins deviner comment m'en servir...
En gros, l'objectif de la fonction est de remplir pData, tandis que le mien est de récupérer toutes les infos de ce même pData.
J'ai donc, en suivant les conseils de Tetramagraton IVHV (ou un truc dans le genre...flemme de copier/coller) mis un breakpoint dans mon prog afin de voir pdt l'exécution ce que j'ai comme type de données dedans:

Code :
  1. hort * values = new short[src->getSize()];
  2. VARIANT * pData = new VARIANT[src->getSize()];
  3. m_gear.AreaGet(0,0,src->getLength() - 1, src->getHeight() - 1, pData, IG_DIB_AREA_DIB);
  4. //On lit le contenu de pData!
  5. short vt;
  6. for(int i = 0; i < src->getSize(); i++)
  7. vt = (pData[i]).vt


Le breakpoint est sur la dernière ligne.
Le pb est que lors de l'exécution, mon (pData[i]).vt ne contient pas de valeur cohérente...
Si quelqu'un sait manipuler ce type de données, pourrait-il m'éclairer?

Reply

Marsh Posté le 20-05-2003 à 14:43:59   

Reply

Marsh Posté le 20-05-2003 à 14:55:22    

skeye a écrit :

Bon, j'arrete de polluer Blabla avec ca...
Voilà le pb:
 
J'utilise un activeX qui me permet d'utiliser une fonction définie comme ceci:

Code :
  1. long CGear::AreaGet(long X1, long Y1, long X2, long Y2, VARIANT* pData, long Format)


 

Code :
  1. hort * values = new short[src->getSize()];
  2. VARIANT * pData = new VARIANT[src->getSize()];
  3. m_gear.AreaGet(0,0,src->getLength() - 1, src->getHeight() - 1, pData, IG_DIB_AREA_DIB);
  4. //On lit le contenu de pData!
  5. short vt;
  6. for(int i = 0; i < src->getSize(); i++)
  7. vt = (pData[i]).vt


Le breakpoint est sur la dernière ligne.
Le pb est que lors de l'exécution, mon (pData[i]).vt ne contient pas de valeur cohérente...


 
C'est koi "src"?
Ensuite t'es sur ke pData est un tableau. Je doute.
Je pense plutot que c juste un parametre [in, out], genre tu passes un VARIANT* et ca te le remplit.
 
Bon alors ma suggestion:

Code :
  1. VARIANT pVal;
  2. VariantInit(&pVal);
  3. HRESULT hr = AreaGet(X1, Y1, X2, Y2, &pVal, IG_DIB_AREA_DIB);
  4. /* ... bla bla avec pVal*/


 
Ensuite tu peux acceder a ce kil y a ds pVal.
Ms fodrait savoir ce ke tu cherches.
"pVal.vt" te donne le "type" du VARIANT (long, short, BSTR, Interface...)
 
Voila.

Reply

Marsh Posté le 20-05-2003 à 15:02:34    

konar_spreme a écrit :


 
C'est koi "src"?
Ensuite t'es sur ke pData est un tableau. Je doute.
Je pense plutot que c juste un parametre [in, out], genre tu passes un VARIANT* et ca te le remplit.
 
Bon alors ma suggestion:

Code :
  1. VARIANT pVal;
  2. VariantInit(&pVal);
  3. HRESULT hr = AreaGet(X1, Y1, X2, Y2, &pVal, IG_DIB_AREA_DIB);
  4. /* ... bla bla avec pVal*/


 
Ensuite tu peux acceder a ce kil y a ds pVal.
Ms fodrait savoir ce ke tu cherches.
"pVal.vt" te donne le "type" du VARIANT (long, short, BSTR, Interface...)
 
Voila.


src c'est un CImage, un type perso...
Pour le fait que pData soit un tableau, c'était une supposition, puisque la doc VB pour areaGet dit:

Citation :


This method retrieves a two dimensional area of pixels bound by the X1, Y1, X2, Y2 coordinates.


Je vais essayer ta proposition, ca pourrait en effet être ca!

Reply

Marsh Posté le 20-05-2003 à 15:11:37    

Avec ta solution, je me retrouve avec vt = 8209...et si j'ai bien lu dans la doc sa valeur devrait être entre 0 et 17 (valeurs valides pour son type)!

Reply

Marsh Posté le 20-05-2003 à 15:20:41    

skeye a écrit :

Avec ta solution, je me retrouve avec vt = 8209...et si j'ai bien lu dans la doc sa valeur devrait être entre 0 et 17 (valeurs valides pour son type)!


 
En fait tu te trompes : 8209 == 0x2011 == VT_ARRAY | VT_UI1
 
Donc tu as un ARRAY de BYTE (un tableau de unisgned short).
Bon ca se complique...

Reply

Marsh Posté le 20-05-2003 à 15:22:44    

konar_spreme a écrit :


 
En fait tu te trompes : 8209 == 0x2011 == VT_ARRAY | VT_UI1
 
Donc tu as un ARRAY de BYTE (un tableau de unisgned short).
Bon ca se complique...


Ahhhhhhhhhhhhh!
J'avais pas pensé à ça...oublié le fonctionnement du '|' !!
:jap: Merci bcp, je crois qu'il m'aurait fallu longtemps avant de trouver ca!

Reply

Marsh Posté le 20-05-2003 à 15:32:26    

skeye a écrit :


Ahhhhhhhhhhhhh!
J'avais pas pensé à ça...oublié le fonctionnement du '|' !!
:jap: Merci bcp, je crois qu'il m'aurait fallu longtemps avant de trouver ca!


 
Bon alors maintenant tu essayes caster ton VARIANT* en SAFEARRAY* (vu ke c un tablo, je pense ke la fonction devrait plutot prendre un SAFEARRAY* qu'un VARIANT*, ms bon)
 
Et tu essayes :  

Code :
  1. SAFEARRAY* psa = (SAFEARRAY*)(&pVal); // pVal est le VARIANT
  2. // Get a pointer to the elements of the array.
  3. HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
  4. if (FAILED(hr))
  5. goto error; // Ca a foiré fort
  6. int = i = psa->rgsabound.cElements; // Et la tu peux normalement recup le nombre d'elements de ton tablo... si ca marche


Reply

Marsh Posté le 20-05-2003 à 15:37:08    

konar_spreme a écrit :


 
Bon alors maintenant tu essayes caster ton VARIANT* en SAFEARRAY* (vu ke c un tablo, je pense ke la fonction devrait plutot prendre un SAFEARRAY* qu'un VARIANT*, ms bon)
 
Et tu essayes :  

Code :
  1. SAFEARRAY* psa = (SAFEARRAY*)(&pVal); // pVal est le VARIANT
  2. // Get a pointer to the elements of the array.
  3. HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
  4. if (FAILED(hr))
  5. goto error; // Ca a foiré fort
  6. int = i = psa->rgsabound.cElements; // Et la tu peux normalement recup le nombre d'elements de ton tablo... si ca marche


 


 :ouch:  
Va falloir que je passe un moment à bien décortiquer tout ca moi...
Merci bcp!!

Reply

Marsh Posté le 20-05-2003 à 15:41:10    

konar_spreme a écrit :


 
Bon alors maintenant tu essayes caster ton VARIANT* en SAFEARRAY* (vu ke c un tablo, je pense ke la fonction devrait plutot prendre un SAFEARRAY* qu'un VARIANT*, ms bon)
 
Et tu essayes :  

Code :
  1. SAFEARRAY* psa = (SAFEARRAY*)(&pVal); // pVal est le VARIANT
  2. // Get a pointer to the elements of the array.
  3. HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
  4. if (FAILED(hr))
  5. goto error; // Ca a foiré fort
  6. int = i = psa->rgsabound.cElements; // Et la tu peux normalement recup le nombre d'elements de ton tablo... si ca marche


 


 
petite erreur d'inattention

Code :
  1. // Il fallait lire:
  2. SAFEARRAY* psa = V_ARRAY(&pVal);


 
Il y a aussi:

Code :
  1. int nbDim = SafeArrayGetDim(psa);


qui te retourne le nombre de dimension de ton SAFEARRAY
 
Enfin voila, bonne chance
 
///////////////////////
Pour finir : tu peux faire une recherche sur les MSDN
KB Q167668
(online http://search.microsoft.com/gomsur [...] %3b167668)


Message édité par konar_spreme le 20-05-2003 à 15:48:30
Reply

Marsh Posté le 20-05-2003 à 16:00:31    

Bon, en gros si je récapitule:
 
Avec ca j'ai un pointeur sur une structure contenant mon tableau:

Code :
  1. SAFEARRAY* psa = (SAFEARRAY*)(&pVal);


 
Avec ca j'ai un pointeur sur mon tableau dans pbstr:

Code :
  1. HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);


 
Puis les 2 autres me permettent de connaitre le nb de dimensions ainsi que celui d'éléments par dimension...j'ai bon?


Message édité par skeye le 20-05-2003 à 16:20:10
Reply

Marsh Posté le 20-05-2003 à 16:00:31   

Reply

Marsh Posté le 20-05-2003 à 16:27:34    

Ca semble bien marcher, j'arrive à retrouver les dimensions de l'image que j'ouvre...Merci mille fois! [:prosterne2]

Reply

Marsh Posté le 20-05-2003 à 16:27:45    

skeye a écrit :

Bon, en gros si je récapitule:
 
Avec ca j'ai un pointeur sur une structure contenant mon tableau:

Code :
  1. SAFEARRAY* psa = (SAFEARRAY*)(&pVal);


 
Avec ca j'ai un pointeur sur mon tableau dans pbstr:

Code :
  1. HRESULT hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);


 
Puis les 2 autres me permettent de connaitre le nb de dimensions ainsi que celui d'éléments par dimension...j'ai bon?


 
Ouais presk.
En fait je m etais planté (un peu le premier coup, rectifié apres)
Avec ca j'ai un pointeur sur une structure contenant mon tableau:

Code :
  1. SAFEARRAY* psa = (SAFEARRAY*)V_ARRAY(&pVal);


 
Oui après t'as bon.
Mate l'exemple ds les msdn, c tout expliké...

Reply

Marsh Posté le 20-05-2003 à 16:28:13    

skeye a écrit :

Ca semble bien marcher, j'arrive à retrouver les dimensions de l'image que j'ouvre...Merci mille fois! [:prosterne2]  


 
parfait.

Reply

Marsh Posté le 20-05-2003 à 16:35:04    

konar_spreme a écrit :


Oui après t'as bon.
Mate l'exemple ds les msdn, c tout expliké...


 

Citation :


The page you were looking for is currently not available. The address may not be correct, or there may be a temporary problem with this site.


 
Je suis en train de regarder l'exemple de SafeArrayAccessData, c'est celui-ci?

Reply

Marsh Posté le 20-05-2003 à 16:37:24    

skeye a écrit :


 

Citation :


The page you were looking for is currently not available. The address may not be correct, or there may be a temporary problem with this site.


 
Je suis en train de regarder l'exemple de SafeArrayAccessData, c'est celui-ci?
 


 
De ma faute, le ')' a collé...
 
http://support.microsoft.com/defau [...] s%3b167668
 
voila, ca devrait etre bon.

Reply

Marsh Posté le 20-05-2003 à 16:42:07    

konar_spreme a écrit :


 
De ma faute, le ')' a collé...
 
http://support.microsoft.com/defau [...] s%3b167668
 
voila, ca devrait etre bon.


Merci encore!
Je vais pouvoir aller me reposre le cerveau tranquille...:D
J'essaierai de récupérer le contenu du tableau demain matin à-partir de ça...:jap:

Reply

Marsh Posté le 21-05-2003 à 08:57:54    

J'ai encore une ou deux petites questions :
Dans l'exemple que tu m'as donné, il est question de chaines de caractères et le type de pbstr est donc BSTR HUGEP *.
En ce qui me concerne ce sera donc plutot BYTE HUGEP *, c'est bien ça? D'ailleurs je n'ai pas trouvé ce que signifiait HUGEP...
 
Ensuite, j'arrive comme je l'ai dit plus haut à récupérer les dimensions de mon image correctement via

Code :
  1. dim1 = (psa->rgsabound[0]).cElements; //largeur
  2. dim2 = (psa->rgsabound[0]).cElements; //hauteur


 
Mais je vois dans cet exemple qu'ils utilisent

Code :
  1. hr = SafeArrayGetLBound(psa, 1, &lLBound);
  2. hr = SafeArrayGetLBound(psa, 1, &lUBound);


pour calculer le nombre d'éléments à-partir des bornes haute et basse...y-a-t'il vraiment une différence ou bien est-ce équivalent?

Reply

Marsh Posté le 21-05-2003 à 09:20:28    

Bon, pour les dimensions ca me donne le même résultat, donc je garde ce que j'avais...
Par contre il semblerait que mon tableau soit mal initialisé ou que j'y accède pas comme il faut.
Voilà comment je procède:

Code :
  1. BYTE * HUGEP *pbstr;
  2. HRESULT hr = SafeArrayAccessData(psa, (void HUGEP* FAR*)&pbstr);
  3. [...]
  4. short * values = new short[nbDim1 * nbDim2];
  5. for(int i = 0; i < nbDim1; i++)
  6. for(int j = 0; j < nbDim2; j++)
  7.   {
  8.    values[i + j * nbDim1] = pbstr[j][i];// + j * nbDim1];
  9.   }   }


 
Ceci plante pour i=0, j=0...
Le débugger m'annonce que pbstr[i] = 0xffffffff
Je suis sur que c'est une connerie, du style le type de pbstr...mais je trouve pas!:(


Message édité par skeye le 21-05-2003 à 09:31:53
Reply

Marsh Posté le 21-05-2003 à 09:50:19    

Bon, j'ai p-e la solution. J'ai mis:

Code :
  1. BYTE *pbstr;


 
Puis j'y accède directement par:

Code :
  1. for(int i = 0; i < nbDim1 * nbDim2; i++)
  2. values[i] = pbstr[i];


Ca ne plante pas à l'exécution, il ne me reste plus qu'à vérifier que je récupère bien mon image...
 
[edit]
C'était bien ca, merci bcp à konar_spreme ( [:prosterne2] )et aussi à tous ceux qui ont lu ce topic!:jap:


Message édité par skeye le 21-05-2003 à 09:56:39
Reply

Marsh Posté le 21-05-2003 à 15:16:12    

Citation :


C'était bien ca, merci bcp à konar_spreme ( [:prosterne2] )et aussi à tous ceux qui ont lu ce topic!:jap:


 
Pas de koi, pour une fois kil y avait une vraie question interessante...


Message édité par konar_spreme le 21-05-2003 à 15:16:45
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed