#3 Štěpán
Vyřešeno, stačilo odstranit optimalizace
Příspěvky odeslané z IP adresy 213.41.138.–
aha, už tomu rozumím, co ty řádky dělají. Jaký ale může být důvod, že ten kód funguje jen v konzolové aplikaci a ve WinAPI ne? Je tam něco, co musím ošetřit? Mohu vůbec používat asembler ve WinAPI aplikaci?
Ahoj,
na netu jsem hledal, jak získat nějaká data o procesoru. Potřebuji nějaké 20B ID, jen pro kontrolu licence. Něco jsem našel a překopal jsem to podle svých potřeb. V konzoli mi normálně b[20] naplní (pokaždé stejně, samozřejmě) . Ve WinAPI mi to padá. Programuji v C (ne c++) (PellesC). Tomu asemblerovskému kódu vůbec nerozumím, máte nápady, co mám nastavit, změnit či tak? Fakt nic mi to neříká...
char VendorID[13];
unsigned char Brand;
unsigned long VersionInfo;
unsigned long FeatureInfo;
_asm
{
mov eax,0
cpuid //CPUID Instruction
mov dword ptr [VendorID],ebx
mov dword ptr [VendorID+4],edx
mov dword ptr [VendorID+8],ecx
mov byte ptr [VendorID+12],0
}
_asm
{
mov eax,1
cpuid //CPUID Instruction
mov VersionInfo,eax //Store Version Information
mov FeatureInfo,edx //Store Feature Information
mov Brand,bl //Store Brand Information
}
BYTE b[20];
memcpy(b,&VersionInfo,4);
memcpy(b+4,VendorID,11);
b[15]=Brand;
memcpy(b+16,&FeatureInfo,4);
Díky za nápady.
Problém vyřešen
#Pragma pack(1) , před windowsáckými #include nefunguje, to pořád hází 48, asi to někde změní...
#Pragma pack(1) za všema windowsovskýma #include už ale funguje, tak jak potřebuji. Nevěděl jsem, že takový alignment existuje, ono vesměs když člověk používá buď celočíselné struktury se samýma DWORD nebo jen matematické se samýma double, tak na to nenarazí. Bylo zapotřebí udělat nějakou komplexnější strukturu jako settings, aby se to ukázalo... Díky za rady
Hmm, tak to jsem ještě neslyšel, díky za radu, kde hledat řešení. Musím na to kouknout...
tak jsem to porovnal pomocí sizeof, trochu jsem si mákl, protože jsem včera přepisoval wsprintf na swprintf, aby to fungovalo na PC, ale přestalo to fungovat zas na mobilu... No tak jsem musel na 150 místech udělat podmíněný překlad...
Takže sizeof na Pocket PC ukazuje 40B
sizeof na PC ukazuje 48B
To je opravdu možné, že systém kvůli něčemu (indexování, rychlost) může nechat některé bajty v paměti nevyužité a ukládat 40B strukturu na 48B (3*16?) ? Mohu se zeptat, které bajty budou vyplněny daty a které ničím? 0...39 nebo 8...47?
Ještě trochu off topic, to není nutné, ale pokud by byla odpověď snadná, nemusel bych to hledat...:)
a) Jak se píše cesta k souboru (nějak zkráceně), který je ve složce se spouštěným exe?
b) PC vyžaduje swprintf(wchar_t*,int,wchar_t*,...) mobil jen swprintf(wchar_t*,wchar_t*,...). Dá se napsat nějak jednoduše funkce, ve které bych udělal podmíněný překlad až vevnitř, tedy jednou? Jde mi o ty tři tečky...
Díky
Ahoj, ještě mám další C (ne c++) dotaz. Aplikace pro Windows mobile je plně funkční, její přepis na PC však není tak snadný, jak by se mohlo zdát. wsprintf vs. swprintf už jsem opravil, tak ještě toto:
//struktura uchovávající nastavení
struct c_settings
{
DWORD dwHandRanking;
double dblEuros;
double dblPounds;
double dblEquity;
DWORD dwAskSite;
DWORD dwActiveSite;
DWORD dwActiveBankroll;
};
//globální proměnná s nastavením
struct c_settings g_pSettings;
//Uložení nastavení
WriteFile(hFile,&g_pSettings,sizeof(struct c_settings),&dwWritten,NULL);
Výsledný soubor má na Windows mobile 40 bajtů, tak, jak to má být. Ale proč má ve Windows PC 48 bajtů? Ten program je stený, liší se pouze v #inculde souborech, platformě... Máte nápad, co by to mohlo způsobovat? Zkopíroval jsem si soubory používané programem na mobilu, a program na PC s nimi začal padat, protože (nejen u příkladu settingů) prostě načítá něco jiného, než co je v těch souborech uložené...
Díky za nápady
díky, swprintf funguje:)
Ahoj,
mám napsanou aplikaci v jazyce C, (ne c++), pro Windows mobile, která funguje. Udělal jsem pár úprav a už běží i na klasickém PC. Jen jedna věc mi nefunguje, a sice při použití wsprintf(sz, L"%.2f",dbl) mi místo čísla vypíše "f"... Na WinMobile to funguje normálně, ale na PC ne. Co s tím? Díky