SAFEARRAY

SAFEARRAY - C++ - Programmation

Marsh Posté le 15-04-2005 à 14:52:33    

Salut,
 
Je fais une appli WMI et j'aimerais récupérer les noms des différents champs qui composent une classe (comme Win32_Processor par exemple).
Et pour se faire, j'ai besoin de manipuler un SAFEARRAY dans une focntion dont voici le prototype:

Code :
  1. HRESULT GetNames(
  2.   LPCWSTR wszQualifierName,
  3.   LONG lFlags,
  4.   VARIANT* pQualifierValue,
  5.   SAFEARRAY (BSTR)** pstrNames
  6. );


 
Le probleme c'est que je ne sais pas si je le manipule bien se SAFEARRAY et comment récupérer les données qui sont dedans?
 
Voici le bout de code qui l'utilise :
 

Code :
  1. ...
  2.     hres = pSvc->ExecQuery(
  3.         bstr_t("WQL" ),
  4.         bstr_t("SELECT * FROM Win32_Processor" ),
  5.         WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
  6.         NULL,
  7.         &pEnumerator);
  8. ...
  9.     IWbemClassObject *pclsObj;
  10.     ULONG uReturn = 0;
  11.  
  12.     while (pEnumerator)
  13.     {
  14.         HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
  15.             &pclsObj, &uReturn);
  16.         if(0 == uReturn)
  17.         {
  18.             break;
  19.         }
  20.         VARIANT vtProp;
  21.         VariantInit(&vtProp);
  22. SAFEARRAY* safeArrayNames;
  23. // Obtains a list of the names of the properties in the object
  24. pclsObj->GetNames(NULL, WBEM_FLAG_ALWAYS, &vtProp, &safeArrayNames);
  25.        
  26. ===== je bloque ici pour récupérer les données dans le safeArrayNames ======
  27. =====   CString variable_qui_contient_le_resultat = les_donnees_du_SAFEARRAY; ======
  28.         VariantClear(&vtProp);
  29.     }
  30. ...


 
 
Si quelqu'un pouvait m'aider ca serait super cool.


Message édité par AsTro le 15-04-2005 à 14:55:48
Reply

Marsh Posté le 15-04-2005 à 14:52:33   

Reply

Marsh Posté le 15-04-2005 à 18:56:44    

:bounce:

Reply

Marsh Posté le 19-04-2005 à 15:38:15    

Bah alors personne ne connait les SAFEARRAY?

Reply

Marsh Posté le 17-06-2005 à 15:21:42    

 hr=mBasicCsv->MaFonction(&inf);
  AfxMessageBox("Lecture OK" );
   
  long lStartBound =0;
  long lEndBound = 0;
  long lDimension[2];
 
  SAFEARRAY* pSafeArray  = inf.parray;
  hr = SafeArrayGetLBound(pSafeArray, 1, &lStartBound);
  hr = SafeArrayGetUBound(pSafeArray, 1, &lEndBound);
 
  for(int iIndex = lStartBound; iIndex <= lEndBound; iIndex ++)
  {
   VARIANT NomChamp;
   lDimension[1] = NbEt_InfoSV;
   lDimension[0] = iIndex;
   
   hr = SafeArrayGetElement(pSafeArray, lDimension, &NomChamp);
   AfxMessageBox(CString(NomChamp.bstrVal));
 
   VARIANT TypeD;
   lDimension[1] = NbEt_InfoSV + 1;
   lDimension[0] = iIndex;
 
   hr = SafeArrayGetElement(pSafeArray, lDimension, &TypeD);
   AfxMessageBox(CString(TypeD.bstrVal)); // message Box qui affiche la valeur
 
   if (CString(TypeD.bstrVal) != 'G')
   {
    VARIANT Valeur;
    lDimension[1] = NbEt_InfoSV + 2;
    lDimension[0] = iIndex;
 
    hr = SafeArrayGetElement(pSafeArray, lDimension, &Valeur);
    AfxMessageBox(CString(Valeur.bstrVal));
   }
  }
 
NbEt_InfoSV = une constante initialisée à 5
Sachant que la premiere dimension de mon tableau est :
NbEt_InfoSV x des entiers  
NbEt_InfoSV : le nom du champ
NbEt_InfoSV + 1 : le type du champ
NbEt_InfoSV + 2 : la valeur du champ
 
j'ai pas trop le temps de t expliquer plus mais en gros :
Tu recupere la taille des 2 dimension de ton tableau avec SafeArrayGetLBound et SafeArrayGetUBound
Et ensuite tu boucle pour récuperer les données qui vont bien
Voila, je repond pas forcement super en avance par rapport à ton post
tu a probablement trouvé la solution tout seul depuis, mais ça pourra toujours aider quelqu'un
 
Bonne chance
++
Billy-Bob

Reply

Marsh Posté le 17-06-2005 à 15:41:20    

Oui, j'avais trouvé depuis le temps ;)
Mais ca pourra surement aider quelqu'un.

Reply

Sujets relatifs:

Leave a Replay

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