Comparaison de texte (tableau TCHAR) [Résolu]

cs_VTwin 13 Messages postés samedi 29 juillet 2006Date d'inscription 28 décembre 2006 Dernière intervention - 23 déc. 2006 à 14:53 - Dernière réponse : cs_VTwin 13 Messages postés samedi 29 juillet 2006Date d'inscription 28 décembre 2006 Dernière intervention
- 23 déc. 2006 à 16:41
Salut à vous et bonnes fetes !

J'ai recupéré sur msdn le bout de code ci dessous. Il permet de lister les clé de registres à un endroit définit.

Mon probleme est que je souhaite savoir si une clé existe. Je parcours donc le tableau de TCHAR ou sont listée les libellés des clés de registre, et je le compare à la clé recherchée :

if(strcmp(achKey, L"Microsoft .NET Framework 2.0")=0)
                {
               
                    MessageBox(NULL, achKey, TEXT("HelloMsg"), 0) ;
                }

Le probleme c'est que ca marche pas, j'ai essayé de faire de plusieurs maniere mais mon if est toujours faux. Je sais en gros que mon achKey est en unicode, et qu'il faut que je le compare a du texte unicode, mais je ne sais pas comment faire malgré mes recherches

-------------------------------------------------------------------------------------------

Le code complet tel qu'il est en ce moment :

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <string.h>

#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383

void QueryKey(HKEY hKey)
{
    TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
    DWORD    cbName;                   // size of name string
    TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name
    DWORD    cchClassName = MAX_PATH;  // size of class string
    DWORD    cSubKeys=0;               // number of subkeys
    DWORD    cbMaxSubKey;              // longest subkey size
    DWORD    cchMaxClass;              // longest class string
    DWORD    cValues;              // number of values for key
    DWORD    cchMaxValue;          // longest value name
    DWORD    cbMaxValueData;       // longest value data
    DWORD    cbSecurityDescriptor; // size of security descriptor
    FILETIME ftLastWriteTime;      // last write time

 
    DWORD i, retCode;
 
    TCHAR  achValue[MAX_VALUE_NAME];
    DWORD cchValue = MAX_VALUE_NAME;
 
    // Get the class name and the value count.
    retCode = RegQueryInfoKey(
        hKey,                    // key handle
        achClass,                // buffer for class name
        &cchClassName,           // size of class string
        NULL,                    // reserved
        &cSubKeys,               // number of subkeys
        &cbMaxSubKey,            // longest subkey size
        &cchMaxClass,            // longest class string
        &cValues,                // number of values for this key
        &cchMaxValue,            // longest value name
        &cbMaxValueData,         // longest value data
        &cbSecurityDescriptor,   // security descriptor
        &ftLastWriteTime);       // last write time
 
    // Enumerate the subkeys, until RegEnumKeyEx fails.
  
    if (cSubKeys)
    {

        for (i=0; i<cSubKeys; i++)
        {
            cbName = MAX_KEY_LENGTH;
            retCode = RegEnumKeyEx(hKey, i,
                     achKey,
                     &cbName,
                     NULL,
                     NULL,
                     NULL,
                     &ftLastWriteTime);
            if (retCode == ERROR_SUCCESS)
            {
               
                if(strcmp(achKey, L"Microsoft .NET Framework 2.0")=0)
                    {
               
                    MessageBox(NULL, achKey, TEXT("HelloMsg"), 0) ;
                }
            }
        }
    }
 
   
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
  
   HKEY hTestKey;

   if( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
        TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\uninstall"),
        0,
        KEY_READ,
        &hTestKey) == ERROR_SUCCESS
      )
   {
      QueryKey(hTestKey);
   }

     return 0 ;
}

Merci pour votre aide
PS : je debute completement le cpp, evitez les termes trop techniques mdr
PS2 : mon prog doit rester du cpp natif

 
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
SAKingdom 3213 Messages postés lundi 7 novembre 2005Date d'inscription 16 février 2009 Dernière intervention - 23 déc. 2006 à 15:15
3
Merci
On ne compare pas un char * avec un wchar_t *. C'est soit un char * char * avec strcmp ou wchar_t * wchar_t * avec wcscmp

C++ (@++)<!--

Merci SAKingdom 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de SAKingdom
Meilleure réponse
cs_aardman 1905 Messages postés mercredi 22 janvier 2003Date d'inscription 17 septembre 2012 Dernière intervention - 23 déc. 2006 à 15:55
3
Merci
Salut,

Si achKey est un tableau de TCHAR, il faut utiliser _tcscmp() et
TEXT("Microsoft .NET Framework 2.0"), sinon tu aura des problemes quand
tu compilera en ansi.

Merci cs_aardman 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de cs_aardman
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 23 déc. 2006 à 15:06
0
Merci
Un test ça s'effectue avec le double égal == et pas avec = qui est une affectation

ULARGE_INTEGERJokyQi=QI("Joky"
Commenter la réponse de cs_Joky
cs_VTwin 13 Messages postés samedi 29 juillet 2006Date d'inscription 28 décembre 2006 Dernière intervention - 23 déc. 2006 à 15:13
0
Merci
Ok merci c'est corrigé. Ca donne donc ca :

if(strcmp(achKey, L"Microsoft .NET Framework 2.0")= =0)
                {
               
                    MessageBox(NULL, achKey, TEXT("HelloMsg"), 0) ;
                }

Mais j'ai une erreur sur mon strcomp qui n'a pas l'air d'apprecier ce que je lui demande :

Error    1    error C2664: 'strcmp' : cannot convert parameter 1 from 'TCHAR [255]' to 'const char *'   

Merci
Commenter la réponse de cs_VTwin
cs_VTwin 13 Messages postés samedi 29 juillet 2006Date d'inscription 28 décembre 2006 Dernière intervention - 23 déc. 2006 à 15:29
0
Merci
Ok ca semble marcher beaucoup mieux avec wscmp!

if(wcscmp(achKey, L"Microsoft .NET Framework 2.0")==0)
                    {
               
                    MessageBox(NULL, achKey, TEXT("HelloMsg"), 0) ;
                }

Merci [auteurdetail.aspx?ID=617077 SAKingdom] !

Faut que je bouquine ces histoires de variables maintenant 

[auteurdetail.aspx?ID=617077
][auteurdetail.aspx?ID=617077 ]
Commenter la réponse de cs_VTwin
cs_VTwin 13 Messages postés samedi 29 juillet 2006Date d'inscription 28 décembre 2006 Dernière intervention - 23 déc. 2006 à 16:41
0
Merci
Ok je vais utiliser ta methode, merci aardman !
Commenter la réponse de cs_VTwin

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.