I'm sat in the eskybar at Sydney airport waiting for my Qantas flight from Sydney to Tokyo - we've arrived at the airport early expecting to check-in for the flight and drop bags, get through security and then sit in the Sydney Qantas Business Lounge - that's not quite how things worked out - it turns out that you can't check in for your flight until three hours before the flight leaves (seems a little odd)... So Loke and I are sat in the Eskybar drinking Diet Coke, jumping on WiFi and catching up with work...
So, anyhow, the point of this post was to discuss creating a custom Windows XP Embedded shell based on an MFC 8.0 application. I'm getting ready for a session I'm delivering in Tokyo in two days and needed to create a custom shell - the shell is an MFC dialog based application that has two buttons, "Start CMD" and "Shutdown" - the behavior of the buttons should be obvious - there was a problem though...
I used the following *excellent* MSDN article that describes how to create a custom Windows XP Embedded shell - I used Depends.exe to determine the baseline dependencies for the application - these are MFC80U.DLL, MSVCR80.DLL
So I added these dependencies to my XPE component - made all of the appropriate changes to make my application a Custom Shell on Windows XP Embedded and then built/booted the XPE image in a Virtual PC environment, and..... nothing.
So, next step was to build a command shell image and add the appropriate MFC application and apparent dependencies, I also added FileMon from SystemInternals
FileMon is a GREAT debugging tool for Windows XP Embedded images (as is RegMon) - In this case I was pretty sure that I was missing some files - turns out that I was missing the manifest files for the application, MFC and MSVCRT - here's the list of files I needed for the application to boot as a custom shell correctly.
The MFC/CRT and MFC/CRT manifest files can be found here (assuming a default install of Visual Studio 2005) - C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86