在程序进行正式编写设计之前有一点是肯定的:程序里需要用到COM接口,要对COM对象进行操作。因此首先要加入初始化COM和终止COM的代码。一般是在应用程序类的InitInstance()函数的开始处和返回前添加初始化COM和终止COM代码的:
…… CoInitialize(NULL); //初始化COM …… CoUninitialize(); //终止COM代码 …… |
以上两个函数在MFC程序和非MFC程序中都可以很好的使用。另外,如果程序框架是以MFC为基础的,那么只需简单的调用AfxOleInit()函数就可以达到同样的目的。而且不必显式调用终止COM的代码。在COM标准中,访问COM对象的唯一途径是COM接口,因此在编写操纵Windows 系统外壳程序首先要得到其提供的COM接口。所用的COM接口是IShellDispatch,它是从IDispatch接口派生来的,在VC安装目录的VC98/Include/Exdisp.h头文件中有定义,下面节选了一些将要用到的接口定义:
…… EXTERN_C const IID IID_IShellDispatch; #if defined(__cplusplus) && !defined(CINTERFACE) interface DECLSPEC_UUID("D8F015C0-C278-11CE-A49E-444553540000") IShellDispatch : public IDispatch { public: …… virtual HRESULT STDMETHODCALLTYPE MinimizeAll( void) = 0; virtual HRESULT STDMETHODCALLTYPE UndoMinimizeALL( void) = 0; virtual HRESULT STDMETHODCALLTYPE FileRun( void) = 0; virtual HRESULT STDMETHODCALLTYPE CascadeWindows( void) = 0; virtual HRESULT STDMETHODCALLTYPE TileVertically( void) = 0; virtual HRESULT STDMETHODCALLTYPE TileHorizontally( void) = 0; virtual HRESULT STDMETHODCALLTYPE ShutdownWindows( void) = 0; virtual HRESULT STDMETHODCALLTYPE Suspend( void) = 0; virtual HRESULT STDMETHODCALLTYPE SetTime( void) = 0; virtual HRESULT STDMETHODCALLTYPE TrayProperties( void) = 0; virtual HRESULT STDMETHODCALLTYPE Help( void) = 0; virtual HRESULT STDMETHODCALLTYPE FindFiles( void) = 0; virtual HRESULT STDMETHODCALLTYPE FindComputer( void) = 0; }; …… |
该接口在CoCreateInstance()函数创建COM对象时将会得到指向其的指针,通过这个函数客户程序可以避免显式同类厂打交道,其实该函数内部也调用了CoGetClassObject()函数来获取COM对象的类厂,只不过它把通过类厂创建对象的过程封装起来了,只需用户指定对象类的CLSID和待输出的接口指针及接口ID,显然这样直接创建COM对象是非常便捷的,在获取到COM对象指针之后就可以通过这个指针去访问调用COM对象里的方法来实现Windows 外壳的种种功能调用了,下面是实现该功能的部分关键代码:
…… HRESULT sc;//返回结果 IShellDispatch *pShellDisp = NULL; //初始化接口指针 //直接创建COM对象 sc = CoCreateInstance( CLSID_Shell,//指定待创建的COM对象标识符 NULL, //指定被聚合时的外部对象的接口指针 CLSCTX_SERVER, //指定组件类别,可以指定进程内组件进程外组件或者进程内控制对象。 IID_IDispatch, //指定接口ID,需要注意的是这里指的是待 //创建的COM对象的接口ID,而非类厂对象的接口标识符 (LPVOID *) &pShellDisp );//存放函数返回的对象的接口指针 /* 在上述代码中,CoCreateInstance首先调用CoGetClassObject函数创建类厂对象,然后用得到的类厂对象的接口指针创建真正的COM对象,最后把类厂对象释放并返回,这样就很好的把类厂屏蔽起来,使用户用起来更为简单。*/ if( FAILED(sc) )//必须用FAILED 或SUCCECCED来判断COM对象是否创建成功 |
在这里通过pShellDisp接口指针调用了COM对象的FindFiles()方法去进行查找文件的系统外壳操作。同样,可以根据实际需要灵活调用响应的方法来执行相应的外壳操作,主要有以下几个方法:
MinimizeAll 所有窗口最小化
UndoMinimizeALL 恢复窗口最小化
FileRun 开始菜单的"运行…"
CascadeWindows 层叠窗口
TileVertically 垂直平铺
TileHorizontally 水平平铺
ShutdownWindows 关闭Windows
Suspend 挂起计算机
SetTime 设定时间
TrayProperties 任务栏属性
Help Windows帮助
FindFiles 查找文件
FindComputer 查找计算机
……
这些接口均在VC安装目录的VC98/Include/Exdisp.h头文件中有定义,可以通过对该文件的查看来编写响应的外壳操作代码。