Ah ce VS 2005, un plaisir je vous dis...
Récupérer une valeur __int64 saisie en chaine ou mettre cette valeur en chaine:
void __stdcall Test(HWND hdlg)
{
char buf[32];
__int64 r;
strcpy(buf, "-987654321987654321");
r = _atoi64(buf);
_i64toa(r, buf);
MessageBox(hdlg, buf, szappname, 0);
}
Jusque là tout va bon, mais cette simple MessageBox vous fera un exe de 37 Ko minimum, une paille.
Alors on se dit: "Je vais me passer du CRT".
C'est somme toute fort inutile si on prog en API, aucun besoin du support multithread CRT puisque j'appelle toujours CreateThread en direct et je n'emploie jamais strtok ou autre fonction pour débile profond de ce genre.
On commencera donc le prog ici (simple exemple):
#pragma comment(linker, "/entry:myWinMain")
__declspec(naked) int __stdcall myWinMain()
{
__asm {
push 0
call dword ptr GetModuleHandle
push eax
push offset AppDlgProc
push 0
push IDD_APP
push eax
call dword ptr DialogBoxParam
push 0
call dword ptr ExitProcess
}
}
Normalement, on obtient le même prog mais de 37 Ko il passe à 3 Ko.
Ben non, trop simple tout cela, ça passait sur les anciens VS mais plus sur le 2005, là oui on se rend compte d'avoir un nouveau compilo sinon...
A partir de dorénavant et dans le cadre de l'emmerdement maximal, plus d'accès aux fonctions standards de la libc si on saute le CRT, adieu itoa() atoi() etc..., consorts 64 bits idem.
Ma simple fonction Test() deviendra par force:
void __stdcall Test(HWND hdlg)
{
char buf[32];
__int64 r;
strcpy(buf, "-987654321987654321");
r = bnatoi64(buf);
bni64toa(r, buf);
MessageBox(hdlg, buf, szappname, 0);
}
Finalement pas de quoi raler puisqu'il suffisait de réécrire une libc perso, dont un extrait:
__declspec(naked) char* __fastcall bnultoa(unsigned int dwnum, char* szdst);
__declspec(naked) char* __fastcall bnitoa(int inum, char* szdst);
__declspec(naked) DWORD __fastcall bnatoui(char *szsrc);
__declspec(naked) int __fastcall bnatoi(char *szsrc);
__declspec(naked) char* __fastcall bnui64toa(unsigned __int64 inum, char* szdst);
__declspec(naked) char* __fastcall bni64toa(__int64 inum, char* szdst);
__declspec(naked) unsigned __int64 __fastcall bnatoui64(char *szsrc);
__declspec(naked) unsigned __int64 __fastcall bnatoi64(char *szsrc);
Comme je disais, un week end bien rempli à écrire en ASM une libc déjà existante et à la tester, QDB pour plaggier Redo.
On a parfois l'impression d'être pris pour un canard sauvage...
A paraitre bientôt sur cppfrance et WinSysDev
ciao...