应用程序的加载是GUI Shell最主要的工作。一旦用户选择了一个图形按钮,该图形按钮就会给管理应用程序的窗口发送一个WM_COMMAND消息,消息的wParam参数携带了图形按钮的ID。这个ID也是对应的应用程序在application profile列表中的位置。这样GUI模块即可根据该ID,定位到应用程序的profile,从而找到应用程序可执行文件(HCX文件)的文件名和路径,把该应用程序加载到内存并执行。
下面是LaunchApplication的关键代码片断,该函数是应用程序管理窗口在处理WM_CREATE消息时调用的:
代码首先根据图形按钮的ID,搜索整个应用程序profile链表。需要注意的是,应用程序profile链表(pAppProfileList)是一个全局变量,因此在这里直接引用即可。当然,这种实现方式有些低效,尤其是链表中的元素非常多的时候。后续可通过hash表等方式进行优化。
在找到应用程序的profile之后,就调用LoadHCX函数,加载这个应用程序。加载过程比较简单,无非是把文件读入内存,做一番检查,如果确认是一个合法的HCX程序,则创建一个线程,执行该程序即可。这里有两个地方需要重点说明一下:(www.xing528.com)
(1)与PE等其他可执行文件类似,HCX文件也有一个入口地点,不过目前的定义是其入口地点,就是HCX文件的开始处。这样做的目的是为了使加载过程简单,而且也似乎没有明显不足。
(2)LoadHCX函数会单独创建一个用户线程,用于执行应用程序。与字符shell的执行方式不同,GUI Shell在创建完用户线程之后,本身仍然会继续运行,而不像字符shell一样等待应用程序结束。也就是说,GUI Shell本身与它创建的任何用户线程没有本质区别,除了优先级可能会有不同。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。