`
mmdev
  • 浏览: 12892232 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Device Emulator共享源码初体验(二)

阅读更多
原以为程序编译之后,让Device Emulator正常运行起来是件很容易的事情。可是这件看起来“很容易”的事情却花了一下午的时间。顺便我们也来说一说模拟器的命令行启动方式。
模拟器代码中的“How To Build”文档并没有很详细地说明如果启动编译好的模拟器,只是简单地说模拟器的命令行与Device Emulator 1.0的命令行完全相同。于是我在网上找到这样一篇文章《How can I launch the Smartphone 2002 emulator without eVT?》,连接如下:http://www.smartphonedn.com/qa/emulator_launch.html
在这里特别说明的是,我们在Visual Studio 2005里使用的Device Emulator和在Visual Studio 2003、EVC 4.0和EVT 3.0中使用的模拟器是两个不同的应用程序,前者是将ARM指令JIT编译成x86指令执行,这也是为什么VS 2005的模拟器可以安装一些ARM指令的应用程序的原因,而后者是通过交叉编译的方式,将代码编译成x86指令后运行在模拟器上的。所以说后者更简单一些,而且这两个模拟器在命令行方面还略有差别,这也是造成我最大困扰的原因。
Visual Stuido 2003里的模拟器叫做“PBEmulator”,我们可以在X:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Emulation的路径下(X表示你安装Pocket PC SDK的盘符),找到一个叫做emul.cmd的批处理,这就是VS 2003和EVC、EVB启动模拟器的方式。
start "" "D:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\bin\PBEmulator.exe" /MemorySize 64 /Fastbackground /Skin "D:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Emulation\pocket_pc_emulator_skin.xml" /CEImage "D:\Program Files\Windows CE Tools\wce420\POCKET PC 2003\Emulation\PPC_2003_WWE.bin" /VMName "POCKET PC 2003 - POCKET PC 2003 Emulator" /HostKey 165
这里边我们注意/CEImage和/Skin两个选项,这两个选项分别指定了模拟器需要调用的Image地址和Skin配置文件的地址,其实有了这两个选项,模拟器就可以正常启动了。
可是问题就出在这里,Visual Studio 2005的DeviceEmultor命令行方式并不一样,而帮助文件里又没有很详细地进行说明。如果你直接双击DeviceEmulator.exe(X:\Program Files\Microsoft Device Emulator\1.0),将显示一个对话框,提示命令行参数。最后,我们实验成功的命令行是这样的:
start "" "C:\Program Files\Microsoft Device Emulator\1.0\DeviceEmulator.exe" "D:\Program Files\Microsoft Visual Studio 8\smartdevices\emulators\Images\PocketPC\2003\1033\PPC_2003_SE_WWE_ARMv4.bin" /skin "D:\Program Files\Microsoft Visual Studio 8\smartdevices\Skins\PocketPC_2003\PocketPC_2003\1033\PocketPC_2003_Skin.xml"
我们要使用的是Visual Studio 2005中自带的Pocket PC 2003的ARM指令的bin文件,而不能使用前面SDK中包含的bin文件。而DeviceEmultor命令行中提示的bitfile,大家千万不要在命令行里写bitfile,而是把bin文件的全路径写进去就可以了,我在这里犯了错误。而/skin部分和PBEmulator是一样的,如果大家想查阅DeviceEmultor的命令行参数,可以在DeviceEmultor的Help里找到:“Device Emulator Command Line Reference”
了解了DeviceEmultor命令行参数,启动模拟器就不会很难了。我们在DeviceEmultor工程的命令行参数中,直接指定就可以了。选择“Project”菜单-“Properties”项,在弹出的菜单中选择Configuration Properties的Debuggin,右侧的Command Arguments项,在里边添加下面的命令行。
"D:\Program Files\Microsoft Visual Studio 8\smartdevices\emulators\Images\PocketPC\2003\1033\PPC_2003_SE_WWE_ARMv4.bin" /skin "D:\Program Files\Microsoft Visual Studio 8\smartdevices\Skins\PocketPC_2003\PocketPC_2003\1033\PocketPC_2003_Skin.xml" /memsize 64

设置完成后,我们直接选择F5进入Debug模式,运行DeviceEmultor.但是DeviceEmultor会提示Error:System resources exhausted.我是在中文的XP SP2和英文的Visual Studio 2005中编译的,不知道是不是语言环境造成的这样的错误提示。
经过反复的跟踪代码,最后确定是在wininterface.cpp的489行,IOWinController类的LCDThreadProc函数中,加载菜单资源时发生的错误。于是我把493行的 exit(1);代码注释掉。再进行编译运行,模拟器终于运行起来了。
大家可以看到,运行起来的模拟器没有菜单,这个问题我们要稍后解决,但是模拟器的整体运行还是正常的。
在这里不得不感叹两句,以前使用一些Open Source的类库时,光导入到开发环境中就需要各种各样的设置、裁减、编译,好不容易编译通过之后,想正常运行的话,还需要修改N处代码才可以。我们必须承认微软在产品发布方面还是有很好的优良传统的。我按照文档的说明,编译过程没遇到任何意外错误,而运行过程只修改了一处代码,这种情况确实很罕见。这从另外一个侧面也反应了,一个成熟的软件公司在代码管理方面的良好风格。这一点确实值得大家学习。如果你提供给同事或者用户的代码,可以有一份指导文档,能够在一天内通过编译,并且被加入到用户的工程中。如果那样,就等于你做了一件大善事。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics