Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1661 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [VC++] Utilisation de VARIANT

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VC++] Utilisation de VARIANT

n°401303
skeye
Posté le 20-05-2003 à 14:43:59  profilanswer
 

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?

mood
Publicité
Posté le 20-05-2003 à 14:43:59  profilanswer
 

n°401315
konar_spre​me
Posté le 20-05-2003 à 14:55:22  profilanswer
 

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.

n°401324
skeye
Posté le 20-05-2003 à 15:02:34  profilanswer
 

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!

n°401341
skeye
Posté le 20-05-2003 à 15:11:37  profilanswer
 

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)!

n°401351
konar_spre​me
Posté le 20-05-2003 à 15:20:41  profilanswer
 

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...

n°401355
skeye
Posté le 20-05-2003 à 15:22:44  profilanswer
 

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!

n°401375
konar_spre​me
Posté le 20-05-2003 à 15:32:26  profilanswer
 

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


n°401387
skeye
Posté le 20-05-2003 à 15:37:08  profilanswer
 

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!!

n°401397
konar_spre​me
Posté le 20-05-2003 à 15:41:10  profilanswer
 

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
n°401425
skeye
Posté le 20-05-2003 à 16:00:31  profilanswer
 

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
mood
Publicité
Posté le 20-05-2003 à 16:00:31  profilanswer
 

n°401470
skeye
Posté le 20-05-2003 à 16:27:34  profilanswer
 

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

n°401471
konar_spre​me
Posté le 20-05-2003 à 16:27:45  profilanswer
 

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é...

n°401472
konar_spre​me
Posté le 20-05-2003 à 16:28:13  profilanswer
 

skeye a écrit :

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


 
parfait.

n°401481
skeye
Posté le 20-05-2003 à 16:35:04  profilanswer
 

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?

n°401493
konar_spre​me
Posté le 20-05-2003 à 16:37:24  profilanswer
 

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.

n°401508
skeye
Posté le 20-05-2003 à 16:42:07  profilanswer
 

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:

n°402079
skeye
Posté le 21-05-2003 à 08:57:54  profilanswer
 

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?

n°402097
skeye
Posté le 21-05-2003 à 09:20:28  profilanswer
 

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
n°402160
skeye
Posté le 21-05-2003 à 09:50:19  profilanswer
 

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
n°402881
konar_spre​me
Posté le 21-05-2003 à 15:16:12  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [VC++] Utilisation de VARIANT

 

Sujets relatifs
où trouver une doc qui détaille l'utilisation des fonctions opengl ?utilisation et modification de nom de fichier
[C++] Utilisation de timer sous Visual C++ avec API Win32ftp_size() utilisation
utilisation d'un select dans le set d'un UPDATEUtilisation de la STL
[HTML,JS] Utilisation subtile de window.open()[C] Méthode Eval() : utilisation ?
java.nio : avantages, perfos, utilisation[php] session : pb utilisation avec des "objets"
Plus de sujets relatifs à : [VC++] Utilisation de VARIANT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR