[Visual C++]CString qui contient un #define

CString qui contient un #define [Visual C++] - C++ - Programmation

Marsh Posté le 22-06-2005 à 10:23:59    

Salut,
Je m'explique.
HKEY_CURRENT_USER est un define :
 

Code :
  1. #define HKEY_CURRENT_USER    (( HKEY ) (ULONG_PTR)((LONG)0x80000001) )


 
Moi j'ai une CString qui contient la chaine HKEY_CURRENT_USER soit :
 

Code :
  1. CString str = "HKEY_CURRENT_USER";


 
Comment je peux faire en sorte de récupérer la valeur de HKEY_CURRENT_USER à partir de ma CSTRING str, exemple :
 

Code :
  1. unsigned long ul = fonction(str);


 
Je ne sais pas si je me fais bien comprendre.
Existe-il une fonction qui me permettrait donc de récupérer la valeur de HKEY_CURRENT_USER à partir de ma CString.


---------------
>>>>>> WebFotos <<<<<<
Reply

Marsh Posté le 22-06-2005 à 10:23:59   

Reply

Marsh Posté le 22-06-2005 à 11:01:54    

Tu dois bien avoir un opérateur de comparaison sur les CString, non ?
 
Edit : bingo ... tu dois pouvoir faire une comparaison du style : <pas testé>

Code :
  1. HKEY CStringToKey(const CString &str) {
  2.   if(str == CString("HKEY_CURRENT_USER" ))
  3.     return HKEY_CURRENT_USER;
  4.   return 0;
  5. }


 


Message édité par theshockwave le 22-06-2005 à 11:06:25
Reply

Marsh Posté le 22-06-2005 à 11:03:18    

Ouais mais justement je voulais éviter une succession de if, else if...
Car je dois le faire pour HKEY_LOCAL_MACHINE et tout le reste.
Mais sinon ca sera la solution effectivement.


Message édité par AsTro le 22-06-2005 à 11:11:27

---------------
>>>>>> WebFotos <<<<<<
Reply

Marsh Posté le 22-06-2005 à 11:10:25    

hum ... cf edit ci-dessus :whistle:

Reply

Marsh Posté le 22-06-2005 à 11:11:52    

theshockwave a écrit :

hum ... cf edit ci-dessus :whistle:


moi aussi j'ai édité :p


---------------
>>>>>> WebFotos <<<<<<
Reply

Marsh Posté le 22-06-2005 à 11:14:50    

mmh, je ne crois pas que tu puisses faire autrement .. .tu auras du mal à faire un switch sur des CString :/
 
je crois que la succession de if / else reste ce qu'il y a de mieux à faire ... D'autant plus que les clés de base de registres ne sont pas encore si nombreuses que ca
 
 
Edit :
si, en fait, si, tu peux faire autrement ...
si tu utilises une std::map<CString, HKEY> que tu remplis correctement :D


Message édité par theshockwave le 22-06-2005 à 11:17:00
Reply

Marsh Posté le 22-06-2005 à 11:28:32    

exemple vite fait :
 

Code :
  1. #include <map>
  2. class CStringToHKEY {
  3.   std::map<CString, HKEY> cles;
  4. public
  5.   CStringToHKEY() {
  6.     map[ CString("HKEY_CURRENT_USER" ) ] = HKEY_CURRENT_USER;
  7.   }
  8.  
  9.   HKEY operator () (const CString &str) const {
  10.     std::map<CString, HKEY>::const_iterator cle = cles.find(str);
  11.     if(cle != cles.end())
  12.       return cle.second;
  13.     return 0; // probablement générateur de warning pour la conversion implicite en HKEY
  14.   }
  15. }


 
(enfin bon, il y a des moyens de faire mieux, pour éviter de reconstruire la map à chaque fois que tu en as besoin, je te laisse chercher à ce sujet)
(edit: public: et cle  :whistle: )


Message édité par theshockwave le 22-06-2005 à 14:07:17
Reply

Marsh Posté le 22-06-2005 à 13:31:50    

J'ai fais des if en fin de compte ;)
 

Code :
  1. HKEY CStringToHKEY(CString str)
  2. {
  3.     HKEY hkey = 0;
  4. if(!str.Compare("HKEY_CLASSES_ROOT" ))
  5.  hkey = HKEY_CLASSES_ROOT;
  6. else if (!str.Compare("HKEY_CURRENT_USER" ))
  7.  hkey = HKEY_CURRENT_USER;
  8. else if (!str.Compare("HKEY_LOCAL_MACHINE" ))
  9.  hkey = HKEY_LOCAL_MACHINE;
  10. else if (!str.Compare("HKEY_USERS" ))
  11.  hkey = HKEY_USERS;
  12. else if (!str.Compare("HKEY_CURRENT_CONFIG" ))
  13.  hkey = HKEY_CURRENT_CONFIG;
  14. return hkey;
  15. }


Message édité par AsTro le 22-06-2005 à 13:33:45

---------------
>>>>>> WebFotos <<<<<<
Reply

Marsh Posté le 22-06-2005 à 13:45:27    

sans pour autant vouloir insister ... La technique avec la map devrait être plus performante, vu qu'il s'agit d'une recherche dans un arbre au lieu d'une bête comparaison séquentielle sur toutes les possibilités ...
Enfin, c'est vrai que se soucier des performances pour ce cas est probablement exagéré

Reply

Marsh Posté le 22-06-2005 à 17:00:29    

clairement, voire hash_map....

Reply

Sujets relatifs:

Leave a Replay

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