Base de registre Windows CE en EVC++ : HELP

patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009 - 21 mars 2005 à 11:13
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009 - 4 avril 2005 à 18:27
Bonjour à tous,
Je reviens à la charge car j'ai tout essayé, sauf la bonne méthode. Ca fait un sacré bout de temps que je me prends la tête pour récupérer dans mon message la valeur que j' attends cad : VBCE.ProjectRun.
Je sais qu'elle y est sur mon pocket, c' est pour ça que je teste pour voir si ça marche
avt de me lancer sur un pocket inconnu !! Mon but est de contrôler si tout est OK pour lancer un prog EVB. Si les valeurs nécessaires n'existent pas, je veux les créer. Je n'ai fait que le début du code et c'est déjà la galère!!
Alors, bonjour la suite!! Je sais, il y a # exemples sur les sites, mais pas 1 ne m'a tirée d'affaire. Je rappelle que je ne connais pas du tout EVC++.
Voici mon petit bout de code qui ne me ramène rien :


#include "stdafx.h"
#include <commctrl.h>
#include <windows.h>
#include <windowsx.h>
#include <commdlg.h>
#include <tchar.h> // Unicode Conversion includes
#include <winreg.h> // registry stuff
//#include <stdio.h> // pour printf


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
HKEY hkey;
LPCWSTR param=NULL;
LPCSTR ch1;
long retval;
DWORD lType;
DWORD cch;
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT(".vb"),0,KEY_ALL_ACCESS,&hkey);
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,&lType,NULL,&cch);
ch1 = LPCSTR(malloc((cch+1)*sizeof(char)));
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,NULL,LPBYTEch1),NULL);
const unsigned short ch2 = (const unsigned short) *ch1;
if (retval!=0)
MessageBox (NULL,&ch2,TEXT("Info"),MB_OK);
else
MessageBox (NULL,TEXT("Problème"),TEXT("Info"),MB_OK);
RegCloseKey(hkey);
return 0;
}
****************
Je dois dire que ce qui est chaîne et conversion de chaînes etc...Je suis noyée ds ce langage
Je vous en supplie, si qq'un peut m'aider, ce serait super!!
MERCI D'AVANCE POUR VOTRE AIDE !! Je craque!

Patdan

11 réponses

cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
27 mars 2005 à 09:59
As tu regardé sur msdn.microsoft.com ?
RegOpenKeyEx = ton 3eme et 4 eme parametres doivent etre a 0. Tu peux tester la valeur de retour (si != ERROR_SUCCESS alors probleme.).

Dans malloc, n'oublie pas que CE travaille QU'AVEC de l'unicode, donc c'est sizeof(TCHAR) (ou 2...)

"const unsigned short ch2 = (const unsigned short) *ch1; " < Ca je vois pas a quoi ca sert.
Dans ta MessageBox, tu n'as qu'a mettre MessageBox(0, ch1, ....); ca marchera, c'est sur.

Bon ca a l'air d'etre a peu pres, bonne chance ;)

+2(p - n)
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
3 avril 2005 à 10:03
Bonjour,

Super sympa d'essayer de m'aider. Mais depuis le début, je me heurte au problème suivant : lorsque j'écris :
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,NULL,LPBYTE(ch1),NULL);
if (retval!=0)
MessageBox (NULL,ch1,TEXT("Info"),MB_OK);
else
MessageBox (NULL,TEXT("Problème"),TEXT("Info"),MB_OK);
RegCloseKey(hkey);
J'ai le message suivant :
error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char *' to 'const unsigned short *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing clarm.exe.

Merci de ton aide AlexMAN, si tu peux continuer à m'aider, je te remercie... (ou qqun d'autre) Merci d'avance à tous
Bonne prog
patdan
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 avril 2005 à 10:35
Alors je t'explique un truc qui m'a "choqué" (pour la fonction RegSetValueEx, donc je pense que c'est pareil) :

Alors, comme tu as pu le voir, le param a passer, c'est un char* (caracteres codés sur un octet), mais comme tu dois le savoir, WinCE ne prend que des caracteres Unicode (enfin les API, si je me trompe pas), donc en fait, il faut que tu passes une chaine unicode (TCHAR*) et que tu castes en (unsigned const char *) pour que ca passe a la compilation :

TCHAR szChaine[128];

RegQueryValue(....., (unsigned const char*)szChaine...);

Et apres tu pourras faire un MessageBox() (MessageBox(), comme je l'ai dit plus haut, n'accepte que des TCHAR*, d'ou ton erreur a la compilation).

Voila, ca devrait marcher, mais dans le cas contraire, n'hesite pas a redemander ;)

Et en

+2(p - n)
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 avril 2005 à 10:35
Ne tiens pas compte du 'Et en' (erreur de ma part).

+2(p - n)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
3 avril 2005 à 12:33
Merci AlexMAN de continuer à me répondre.Voici mon mini prog. Je n'ai plus d'erreur de compil, mais je me retrouve comme avt avec une valeur vide.

HKEY hkey;
LPCWSTR param=NULL;
//LPCSTR ch1;
TCHAR ch1[128];
long retval;
DWORD lType;
DWORD cch;
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT(".vb"),0,0,&hkey);
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,&lType,NULL,&cch);
//ch1 = LPCSTR(malloc((cch+1)*sizeof(TCHAR)));
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,NULL,(unsigned char*)ch1,NULL);
//const unsigned short ch2 = (const unsigned short) *ch1;
if (retval!=0)
MessageBox (NULL,ch1,TEXT("Info"),MB_OK);
else
MessageBox (NULL,TEXT("Problème"),TEXT("Info"),MB_OK);
RegCloseKey(hkey);
return 0;
Je rappelle que sur mon pocket , cette valeur existe : VBCE.ProjectRun
Je tourne en rond.

Merci encore !! et désolée du dérangement

patdan
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 avril 2005 à 13:09
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,NULL,(unsigned char*)ch1,NULL);

Il te manque pas mal de parametres :

RegQueryValueEx(..., REG_SZ, (unsigned char *)ch1, &Count);

Je presume que tu veux recuperer une clé de type 'string', sinon regarde au lien que je te donne plus bas. Count doit contenir la taille en octet de ch1.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceobjst/html/cerefregqueryvalueex.asp

Pense a regarder sur msdn, c'est la BASE de connaissance indispensable.

Et surtout, tu ne me deranges pas ;)

+2(p - n)
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
3 avril 2005 à 17:41
C'est encore moi!! MSDN OK j'y vais souvent ms ne connaissant pas le C++, il n'y a pas d'exemple et je plane.
Mon code avec REG_SZ comme tu m'as conseillé :
HKEY hkey;
LPCWSTR param=NULL;TCHAR ch1[64];
long retval;
DWORD lType;
DWORD cch;
DWORD Count;
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT(".vb"),0,0,&hkey);
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,&lType,NULL,&cch);
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,REG_SZ,(unsigned char*)ch1,&Count);
if (retval!=0)
MessageBox (NULL,ch1,TEXT("Info"),MB_OK);
else
MessageBox (NULL,TEXT("Problème"),TEXT("Info"),MB_OK);
RegCloseKey(hkey);
return 0;
error C2664: 'RegQueryValueExW' : cannot convert parameter 4 from 'const int' to 'unsigned long *'
Si je mets NULL à la place de REG_SZ, pas d'erreur compil, mais le msg donne "Problème" à l'exec
D'autre part, je suis assez nulle pour ne pas savoir exploiter la taille Count. J'avais il y a qque tps essayé des ".left"...mais j'avais tjrs un pb du style left de .Left doit être de type Struct/union/ etc...
J' ai honte de le dire , mais je cherche partout depuis plus d'1 mois Eh oui!! C'est pour ça que je deviens casse-pompe. Je désespère.C'est triste à dire mais il faut quasiment me mâcher le boulot, vu que j'ai tout essayé sans résultat
Merci de ta patience AlexMAN. J'espère que tu en as en réserve...

patdan
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
3 avril 2005 à 20:04
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,REG_SZ,(unsigned char*)ch1,&Count);

C'est une erreur de ma part, je suis allé vite, et j'ai mal lu MSDN, dsl.
Donc voila comment faire :

retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,&Type,(unsigned char*)ch1,&Count);

DWORD Count = TAILLE DE TON BUFFER; (tu fais un appel pour connaitre la taille du buffer a allouer, donc tu n'as qu'a donner ta variable contenant cette taille).
DWORD Type;

Type contiendra le type de données que tu viens de recuperer (REG_SZ...Etc).

Voila, si t'as encore des soucis, n'hesite pas, c'est avec plaisir :)

+2(p - n)
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
3 avril 2005 à 22:36
Encore moi!! :
J'ai essayé ton code et ayant tjrs des pbs (erreurs compil, pb exec etc...) J'ai encore bidouillé , mais mal comme dab : voilà mon code à la noix qui me rapporte tjrs le msg : "Problème" au lieu du message avec ma valeur attendue. C'est bien une string que je dois recevoir : "VBCE.ProjectRun"
HKEY hkey;
LPCWSTR param=NULL;TCHAR ch1;
long retval;
DWORD lType;
DWORD Count;
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT(".vb"),0,0,&hkey);
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,&lType,NULL,&Count);
DWORD Lg = Count;
ch1 = TCHAR(malloc(Lg*sizeof(char)));
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,NULL,(unsigned char*)ch1,&Lg);
if (retval!=0)
MessageBox (NULL,(const unsigned short*)ch1,TEXT("Info"),MB_OK);
else
MessageBox (NULL,TEXT("Problème"),TEXT("Info"),MB_OK);
RegCloseKey(hkey);

Si tu avais l'occasion de tester ce que je veux faire avec une string à toi au cas où tu n'aies pas de prog EVB sur ton pocket, ce serait certainement le mieux.Quand tu auras du temps bien sûr...
Merci encore pour tout ce que tu fais. Je n'ai jamais eu beaucoup de réponses sur ce site,( je dois poser des questions idiotes ou curieuses), par contre j'ai vu que pour critiquer ou s'insulter les réponses sont plus nombreuses hélas. Heureusement il reste des gens sérieux et serviables et on trouve tout de même souvent des choses intéressantes
Bonne soirée et bon courage

patdan
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
4 avril 2005 à 06:40
Ce code compile ?
Deja, TCHAR *ch1;

Et ensuite, serieusement, regarde plus attentivement MSDN ! En cas de succes, la fonction te renvoie ERROR_SUCCESS (== 0), donc ton test devient :

if (ERROR_SUCCESS == retval) MessageBox(0, ch1, 0, 0);

(Pas besoin de casts, ch1 est deja un pointeur sur un type short.)

Voila, ++

+2(p - n)
0
patdan Messages postés 37 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 3 avril 2009
4 avril 2005 à 18:27
Merci AlexMAN. Tu m'as donné le courage de continuer et ce tout petit bout de code marche et ramène bien lachaîne attendue :
{
HKEY hkey;
TCHAR ch1[64];
long retval;
DWORD Count;
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT,TEXT(".vb"),0,0,&hkey);
retval = RegQueryValueEx(hkey,TEXT("Default"),NULL,NULL,(unsigned char*)ch1,&Count);
if (retval == ERROR_SUCCESS)
MessageBox (NULL,ch1,TEXT("Info"),MB_OK);
else
MessageBox (NULL,TEXT("Problème"),TEXT("Info"),MB_OK);
RegCloseKey(hkey);
return 0;
}
Disons que j'aurais aimé ne pas donner une taille hasardeuse à ch1, mais la récupérer par Count, mais n'ayant pas réussi malgré tous mes trafics, j'arrête là pr le moment.
Merci encore 1000 fois de m'avoir aidée.
Bonne continuation.

patdan
0
Rejoignez-nous