Erreur bizarre : MessageBox affiche du texte en japonais

Résolu
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011 - 22 avril 2008 à 09:14
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011 - 24 avril 2008 à 09:09
Bonjour à tous !

J'ai quelques problêmes avec visual studio C++. Quand j'utilise une MessageBox le texte apparait ... en japonais. J'ai désactivé le support de ces caractères et à la place j'obtiens ... des carrés. Là je comprend pas, parceque mes pointeurs sont bon ; si je fais varier la longeur de mes chaines, ca varie aussi dans la messagebox.

Petit détail , au lieu de lire les caractères comme faisant 1 octect (ASCII normal) l'api semble les lire par deux (chaine de 6 caractères en fait 3jap. et elle ne reconnait le zéro terminal que si il fait 2octet).

Si quelqu'un à une idée, parceque ca me faisait pas ça avec masm32...

Merci d'avance !

Voilà le code :

    char ClasseFenetre[8]="BUTTON";      //chaine au hazard
    char HgTitreFenetre[27]="Session Hydrargyrum 0.20a";
    OffsetClasse=&HgClasseFenetre[0];
    OffsetTitre=&HgTitreFenetre[0];
 __asm {
    mov eax,0
    mov ebx,OffsetClasse
    mov ecx,OffsetTitre
    mov edx,MB_YESNO+MB_ICONEXCLAMATION
    push edx
    push ecx
    push ebx
    push eax
    call DWORD PTR MessageBox
    }
Franchement je voit pas d'où ça peut venir ...

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.

11 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 avril 2008 à 21:35
http://brunews.com/Msgbox.rar

Vois que c'est réglé pour compilation ANSI et non UNICODE.

TEMPLATES C/C++ POUR VS 2008
http://www.cppfrance.com/code.aspx?ID=44835
Tu as tout ce qu'il faut ici pour préparer des projets correctement configurés. J'ai pris projet Cdlg comme template pour faire Msgbox.exe, c'est ultra simple d'emploi.

ciao...
BruNews, MVP VC++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2008 à 10:27
char ClasseFenetre[]= "BUTTON";
char HgTitreFenetre[]= "Session Hydrargyrum 0.20a";


Ces 2 chaines en haut de module, segment .data mis par le compilo.


Fonction FULL ASM ou FULL C mais jamais de mixage !!!
__declspec(naked) void __stdcall bnMsgbox()
{
  __asm {
    push   0
    push   offset HgTitreFenetre
    push   offset ClasseFenetre
    push   0
    call   dword ptr MessageBox
    ret    0
  }
}

ciao...
BruNews, MVP VC++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
22 avril 2008 à 13:07
Tient je me demandait aussi comment on faisait pour faire autre chose que des variables locales(sur la pile) en C, j'avais pas pensé à simplement les mettres hors d'une fonction.
Note : il s'agit pas d'une fonction , le code que j'ai mis est dans le corps de 'main'. 

J'arrive pas à déclarer ta fonction (enfin, le linker ne la trouve pas). Je la met avant 'main' et je met 'DWORD __stdcall bnMsgBox();' dans l'entête,  pourtant j'ai quand même 'error LNK2001: symbole externe non résolu _bnMsgBox@0'.

J'ai remplacer par tes instructions (chaine dans l'entete,...) mais ca donne toujours du jap. (enfin, des cubes là). Mais c'est pas normal, peut importe ce qu'on passe comme argument, la fonction est sensé recevoir une chaine qu'elle interprête comme de l'ASCII, hors y a pas de caractère asiatique dans ce format, donc comment elle fait ???

Rah, c'était tellement plus simple avec du pur asm. Qu'est-ce qui faut pas faire pour avoir accés à 4 pauvres instructions en plus ...

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2008 à 13:26
C'est du PUR ASM !!!
faut juste bien comprendre ce qui se passe.

quand tu mets:
char ClasseFenetre[8]="BUTTON";
dans une fonction, les octets "BUTTON" sont bien placés par le compilo dans le segment .data, idem si on l'avait fait à la main dans MASM.

ciao...
BruNews, MVP VC++
0

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

Posez votre question
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
22 avril 2008 à 13:39
Ah ?
Etrange , parceque le compilateur me refuse toute commande 'offset Variable', si 'Variable' est dans le corps d'une fonction (pas de problêmes maintenant que je les ais mises en dehors), avec 'lea eax,variable' ca fonctionne par contre.
Ca ressemblait au problême de MASM qui refuse la commande 'offset' sur une variable locale : celle-ci est dans la pile et non dans le segment de data.
Je me suis donc dit que les variables déclaré hors de l'entête en C sont elles aussi des variables locales.

Et pour ce qui ce qui est de savoir comment une fonction qui est sensée interprété de l'ASCII se met à faire ... autre chose ? Et pour la déclaration de fonction ? J'ai été voir tes autres codes sources (a force de poser des questions et que ce soit toujours toi qui réponde je commence à avoir un gros dossier 'Code BruNews' sur mon disque ), mais je voit pas où j'ai m... dans la déclaration (c'est décidé ce soir j'achète C++ pour les nuls en rentrant).

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
22 avril 2008 à 13:50
C'est clair, offset est calcul (debSegment - posSegment) donc ce qui est sur stack ne peut pas fonctionner ainsi mais en décalage de ESP.

ciao...
BruNews, MVP VC++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
22 avril 2008 à 19:10
Bon finalement j'ai pas eu besoin du bouquin.
J'ai définit ta fonction, je la lance et .... Japonais .
Donc ça vient pas du code.
Y a un réglage 'forcer l'affichage de caractère bizarre' dans les options de VSC++, des fois que je l'aurais coché par erreur ?

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
23 avril 2008 à 13:12
Personne n'a de solution ?
Parceque tant que j'arrive pas à afficher correctement une simple msgBox, c'est même pas la peine d'essayer les autre API.

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
23 avril 2008 à 13:27
Mets un lien sur ton projet VS, je regarderai ce soir en rentrant.

ciao...
BruNews, MVP VC++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
23 avril 2008 à 17:25
C'est fait :
http://hydrargyrum.ifrance.com/telechargement/Demonstration.rar.txt
Il faudra enlever le '.txt' aprés le téléchargement (un problême avec l'hébergeur).
Merci de ton acharnement à m'aider.

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
24 avril 2008 à 09:09
Excellent ! J'ai juste changé le réglage 'jeux de caractère' et tout marche comme prévut .
Merci !
Je vais enfin pouvoir me remettre à programmer vraiment (3semaines que je galère avec ce compilo. je commençait à être en manque ... )

<hr size="2" width="100%" />Jetez un coup d'oeil à mon projet de moteur 3D par lancer de rayons : 
http://hydrargyrum.ifrance.com.
0
Rejoignez-nous