begin process at 2012 05 28 12:55:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

API Win32, problème de variable


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

API Win32, problème de variable

lundi 17 février 2003 à 21:54:44 | API Win32, problème de variable

bouba

Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.

LPSTR Path="";

LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case FICHIER_NOUVEAU:
SetDlgItemText(hWnd, 0, "");
break;
case FICHIER_OUVRIR:
Path = OuvrirFichier(hWnd);
break;
case FICHIER_SAVE:
SauverFichier(hWnd,Path);
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
break;
case FICHIER_SAVEAS:
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
Path = SauverSousFichier(hWnd);
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
break;
case FICHIER_PRINT:
break;
case FICHIER_QUITTER:
PostQuitMessage(0);
break;
case AIDE_PROPOS:
DialogBox(GetModuleHandle(NULL),"AIDEDIALOG",hWnd,AideDialogProc);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_SIZE:
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return (0L);
}

Bon, voila le problème est dans la variblale Path, a ce niveau

case FICHIER_SAVEAS:
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
Path = SauverSousFichier(hWnd);
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);

J'utilise deux messageBox pour tester, la première m'affiche donc une chaine vide et la deuxième le résultat retourné par la fonction SauverSousFichier. Jusqu'ici tout va bien mais lorsque je repasse par le même code:

case FICHIER_SAVEAS:
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
Path = SauverSousFichier(hWnd);
MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);

La première messageBox me réaffiche une chaine vide alors que je souhaiterais quelle m'affiche la chaine quelle m'avais affiché au passage précédent.
Je ne comprends pas, c'est comme si la variable Path était vidé après chaque appel de la fonction WndProc.
Comment faire pour que le contenu de cette variable ne se vide pas après chaque passage dans cette fonction?
lundi 17 février 2003 à 22:28:05 | Re : API Win32, problème de variable

BruNews

Administrateur CodeS-SourceS
Salut,
Path = SauverSousFichier(hWnd);
comment veux-tu que retourne quoi que ce soit.
Faudrait que to Path soir char *Path; et que ta func SauverSousFichier alloue la memoire et fasse pointer Path dessus. Toi tu as defini une constante chaine de longueur nulle.
char Path[260];
change tes funcs ainsi:
BOOL SauverSousFichier(HWNDhwnd, char *pszPath);
ta func doit remplir pszPath et retouner 1 si fait sinon 0.
Idem pour le reste.
ciao...

-------------------------------
Réponse au message :
-------------------------------

> Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.
>
> LPSTR Path="";
>
> LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
> {
> switch(uMsg)
> {
> case WM_CREATE:
> break;
> case WM_COMMAND:
> switch(LOWORD(wParam))
> {
> case FICHIER_NOUVEAU:
> SetDlgItemText(hWnd, 0, "");
> break;
> case FICHIER_OUVRIR:
> Path = OuvrirFichier(hWnd);
> break;
> case FICHIER_SAVE:
> SauverFichier(hWnd,Path);
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
> break;
> case FICHIER_SAVEAS:
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
> Path = SauverSousFichier(hWnd);
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
> break;
> case FICHIER_PRINT:
> break;
> case FICHIER_QUITTER:
> PostQuitMessage(0);
> break;
> case AIDE_PROPOS:
> DialogBox(GetModuleHandle(NULL),"AIDEDIALOG",hWnd,AideDialogProc);
> break;
> }
> break;
> case WM_DESTROY:
> PostQuitMessage(0);
> break;
> case WM_SIZE:
> break;
> default:
> return DefWindowProc(hWnd, uMsg, wParam, lParam);
> }
> return (0L);
> }
>
> Bon, voila le problème est dans la variblale Path, a ce niveau
>
> case FICHIER_SAVEAS:
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
> Path = SauverSousFichier(hWnd);
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
>
> J'utilise deux messageBox pour tester, la première m'affiche donc une chaine vide et la deuxième le résultat retourné par la fonction SauverSousFichier. Jusqu'ici tout va bien mais lorsque je repasse par le même code:
>
> case FICHIER_SAVEAS:
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
> Path = SauverSousFichier(hWnd);
> MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
>
> La première messageBox me réaffiche une chaine vide alors que je souhaiterais quelle m'affiche la chaine quelle m'avais affiché au passage précédent.
> Je ne comprends pas, c'est comme si la variable Path était vidé après chaque appel de la fonction WndProc.
> Comment faire pour que le contenu de cette variable ne se vide pas après chaque passage dans cette fonction?
>
mardi 18 février 2003 à 04:01:29 | Re : API Win32, problème de variable

jonathanmcdougall

> Salut a tous, j'ai un blem de variable dans mon programme. Voici mon code source.
>

<snip>

>
> Bon, voila le problème est dans la variblale Path, a ce niveau
>
> case FICHIER_SAVEAS:
>MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
>Path = SauverSousFichier(hWnd);
>MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
>
> J'utilise deux messageBox pour tester, la première m'affiche donc une chaine vide et la deuxième le résultat retourné par la fonction SauverSousFichier. Jusqu'ici tout va bien mais lorsque je repasse par le même code:
>
>
> case FICHIER_SAVEAS:
>MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
>Path = SauverSousFichier(hWnd);
>MessageBoxEx(NULL,Path,"Error",MB_OK,0x040c);
>
> La première messageBox me réaffiche une chaine vide alors que je souhaiterais quelle m'affiche la chaine quelle m'avais affiché au passage précédent.
> Je ne comprends pas, c'est comme si la variable Path était vidé après chaque appel de la fonction WndProc.
> Comment faire pour que le contenu de cette variable ne se vide pas après chaque passage dans cette fonction?
>

Faudrait voir le code de SauverSousFichier(), mais voilà ce que je pense être ton code :

char *SauverSousFichier(HWND hwnd)
{
// ...
return "mon path";

// ou encore

char path[32];
//.. mettre qqch dans 'path'
return path;
}

Dans ces deux cas, la valeur de retour est une string *temporaire*, c'est-à-dire qu'elle est locale à la fonction. En faisant

Path = SauverSousFichier(HWND hwnd);

tu stockes l'adresse d'une string qui *n'existe plus* dans Path. Tu vas répondre que des fois Path contient la bonne valeur, mais c'est un coup de chance. La mémoire à cette adresse n'a probablement pas été touchée. C'est un exemple typique de 'undefined behavior', comportement non-défini.

Tu as deux solutions : 1) utiliser des std::string ou 2) allouer ta chaine avec new.

1) # include <string>

//note : retour par valeur
std::string SauverSousFichier(HWND hwnd)
{
// ....
return std::string("mon path");

// ou

const char *monPath;
// ...
return std::string(monPath);
}


2)
char *SauverSousFichier(HWND hwnd)
{
const char* monPath;
//....

//allocation dynamique
// la longueur est strlen(monPath)
const char* pour_retourner = new char[strlen(monPath)];

//copie
strcpy(pour_retourner, monPath);

//retour
return pour_retourner;
}

Mais bien sûr, il ne faut pas oublier de faire un delete sur la variable qui stockera cette chaine. Ce qui fait que :

Path = SauverSousFichier(hwnd);
Path = SauverSousFichier(hwnd);
delete[] Path;

est un memory leak, puisque la chaine allouée avec new n'est pas deletée. La bonne manière sera celle-ci :

Path = SauverSousFichier(hwnd);
delete[] Path;
Path = SauverSousFichier(hwnd);
delete[] Path;

Mais la vraie bonne manière serait d'utiliser les std::string, ça t'enlèverait un paquet de problèmes. Note que les std::string se convertissent en const char* avec la fonction membre c_str().

Jonathan Mcdougal
Montréal, Québec
mcdougalljonathan@hotmail.com
http://www.multimania.com/utopiasoftware

mardi 18 février 2003 à 11:55:17 | Re : API Win32, problème de variable

bouba

Vraiment, je te remercie, c'est super je suis enfin débloqué!!!!!


Cette discussion est classée dans : fichier, case, break, hwnd, path


Répondre à ce message

Sujets en rapport avec ce message

Problème avec WM_KEYDOWN: [ par cognac ] Pourquoi est-ce que "j" est toujours égal à 2 lorsque je presse F1(même la première fois). Je pensais qu'à chaque fois que je presse F1 "j" augmente d Le jeu du serpent en C++ / niveau débutant [ par edouard57 ] Bonjour à tous, Je débute en C ++ et opengl. Pour m'entrainer j'essaie de réaliser un petit jeu le serpent. Pour l'instant j'arrive à créer un carré d Affichage d'un boutton en Win32 [ par Crazy_Joe ] Bonjour à tous, Cela va peut-être vous paraître assez bénin mais je n'arrive pas à afficher un boutton tout simple dans mon application. Voici un bou Recuperer la notification EN_CHANGE [ par KinNoShishi ] Bonjour à tous, Je suis dans impasse depuis plusieurs heures maintenant... Je n'arrive pas à récupérer le message EN_CHANGE qui me permettrait de pou Creation et lecture d'un fichier typé en C [ par Razily ] Bonjour , voilà j'ai un projet de Mastermind à rendre bientôt et je coince sur une partie du code notamment sur l'enregistrement ! l'idée c'est que le richedit bloquer la modification d'un document [ par babyboo1107 ] Bonjour j'aimerais savoir comment faire pour lorsque je fais fermer le document il me met une fenetre gisée(ca j'ai trouver) mais ou il ne soit pas po Touches clavier [ par F0ra ] Salut,Mon problème c'est que ça ne fonctionne pas quand j'appuie sur la touche de droite et bas en même temps par exemple.Que faire ?case WM_KEYDOWN:s rachraichissement fenetre winapi en c [ par dyroj ] bonjour a tous,sa faire quelque semain que j'ai un gros probleme avec le rechaichissement winapi, se probleme menpaiche d'avancer dans mais projet.se Violation d'accès mémoire [ par zoneart ] Bonjour,Je suis débutant et j'ai écris deux trois lignes de codes que j'aimerais vous soumettre car une erreur de violation d'accès mémoire survient l Deplacement de plusieurs sprites à l'écran (SDL) [ par rasolofomanana ] Bonjour à tous, je débute en C et j'essaie de créer un programme où l'on peut déplacer plusieurs sprites à l'écran, par cases de 40px. Le problème es


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales