epineurien
Messages postés83Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention22 mars 2011
-
22 avril 2008 à 09:14
epineurien
Messages postés83Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention22 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.
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.
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
}
}
epineurien
Messages postés83Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention22 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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++
Vous n’avez pas trouvé la réponse que vous recherchez ?
epineurien
Messages postés83Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention22 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.
epineurien
Messages postés83Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention22 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.
epineurien
Messages postés83Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention22 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.