MDA Compact II versus MFC 8.0

aplikace.exe není platná aplikace systému Pocket PC, taková hláška nepotěší nikoho. Zvlášť ne vývojáře, který ví, že ta hláška může na Pocket PC znamenat prakticky jakoukoliv chybu – a který hlavně ví, že přesně tuhle aplikaci otestoval na několika jiných zařízeních a bez problémů běhá.

Že Windows Mobile 5.0 není se staršími verzemi úplně kompatibilní se ví už dlouho, ale že by jejich nekompatibilita sahala až tak daleko se taky věřit nechce – ne, chybu je nutné hledat někde jinde.

Možných příčin chyby je několik – špatně specifikovaná architektura nebo subsystém, některá z dll knihoven, na kterou se aplikace odkazuje, buď chybí a nebo není na zařízení její správná verze (oblíbená varianta je, že se aplikace odkazuje na ladící verzi knihovny i v release konfiguraci). A nebo, což je rafinovanější verze téhož, k problému nedochází přímo v aplikaci, ale v některé z odkazovaných dll knihoven.

Co ale dělat ve chvíli, kdy architekturu a subsystém kontrolujete poněkolikáté, víte jistě, že všechny potřebné dll knihovny se instalují s aplikací, že ladící verze nepoužíváte a že na Pocket PC 2003 všechno funguje jak má. A na jiných zařízeních s WM 5.0 taky… jenom ty proklaté MDA Compact II se pořád brání. Google v takové situaci moc nepomáhá – hláška o neplatné aplikaci může na Pocket PC znamenat opravdu cokoliv, taže odkazy které k ní Google najde můžou vést.. kamkoliv). Lepší volba ale nebyla (návrh zahrnující MDA, cihlu a kladivo bohužel neprošel), takže člověka, který na stejný problém už narazil, nakonec nacházíme. A přeci jen to bude špatná verze knihovny, konkrétně MFC.

To by nemělo vadit, k aplikaci jsme správnou verzi přibalili. Chyba, vadí! V jednom příspěvku na microsoftím fóru je nenápadná, ale dost důležitá zmínka o “optimalizaci” na Pocket PC při načítání dll knihoven. Pokud totiž systém zjistí, že knihovna se stejným názvem už je načtená, tak ji znovu nenačítá – a to ani pokud je ve složce aplikace. Kontroluje se ale jenom jméno, ale už ne plná cesta nebo verze souboru(!). Takže od každé knihovny se použije nejvýše jedna verze… ta, která se načte jako první. Takže kdyby hypoteticky v systému byla nainstalovaná starší verze MFC, než proti jaké linkuje Visual Studio… to by třeba nemusely na MDA Compact II některé aplikace fungovat ;)

A taky že jo, po zkopírování mfc80U.dll a msvcr80.dll ze složky aplikace (!) do \Windows a restartu zařízení (!) se MFC načetlo správně a náš program běhá. Co dělají ostatní aplikace jsme raději nezkoušeli – ale ve stejném MS fóru se píše o tom, že nové verze MFC budou zpětně kompatibilní, takže teoreticky by se nic rozbít nemělo. Teoreticky.

Takže, poslední probém – jak ty dll do \Windows dostat a jak se zbavit toho restartu? Změnou cesty v CABu to nejde, to jsme si vyzkoušeli a vytvářet kvůli tomu složitější instalátory..? Nemáte někdo nějaký dobrý nápad jak to tam jednoduše dostat?

Dokud se nenajde odpověď musím uznat, že v souboji MDA Compact II – aplikace ten malý černý zmetek jasně vede.

Bookmark and Share

One Response to “MDA Compact II versus MFC 8.0”

  1. Mem Says:

    Hezke ;-)