博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何通过CSP编程卸载Windows Mobile应用程序
阅读量:6292 次
发布时间:2019-06-22

本文共 3076 字,大约阅读时间需要 10 分钟。

 

如何通过CSP编程卸载Windows Mobile应用程序

黄季冬

摘要

  和Windows PC一样,Windows Mobile中也提供了删除应用程序的控制面板项,但是有时候我们需要在程序中去卸载另外的程序,或者卸载应用程序本身,这样的情况在企业级应用里十分常见。这时需要用到系统配置服务文件CSP(Configuration Service Providers)。本文介绍了如何使用CSP在程序中卸载Windows Mobile上安装的应用程序。 

 

最简单的解决方案

    如果不使用CSP,可以在程序中调出系统自带的删除程序的控制面板项,如图1

图1

这种方式比较简单,下面的代码实现了这个功能: 

ContractedBlock.gif
ExpandedBlockStart.gif
Code
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName 
= @"\Windows\ctlpnl.exe";
        startInfo.Arguments 
= "cplmain.cpl,10";
         Process.Start(startInfo);

关于如何调用系统自带的控制面板可参考这篇文章:

 

CSP简介

 

  虽然上面这种丢给用户一个标准界面的方法很简单,但它不能在程序中直接控制删除特定的程序。如果你是公司的IT管理员,我想你应该不会让这种情况发生,这时就需要用到CSP了。那什么是CSP呢?CSP(Configuration Service Providers)是一组通过XML来查询和修改系统设置的接口。这里的XML文件我们把它叫做OMA Client Provisioning (WAP-based) XML File。Windows Mobile上面目前对CSP的支持情况可查阅本文:

Windows Mobile为投递类似WAP-PUSH的CSP XML文件提供了编程接口:

HRESULT DMProcessConfigXML(

  LPCWSTR pszWXMLin,

  DWORD dwFlags,

  LPWSTR* ppszwXMLout

);

该函数定义在头文件Cfgmgrapi.h中。

下面的例子演示了如何通过CSP添加一个IE收藏夹项:

 

ContractedBlock.gif
ExpandedBlockStart.gif
Code
//定义XML provision file
LPCWSTR g_wszFavoriteXml = 
    L
"<wap-provisioningdoc> "
    L
"   <characteristic type=\"BrowserFavorite\""
    L
"      <characteristic type=\"CNBlog\""
    L
"         <parm name=\"URL\" value=\"http://www.cnblogs.com//> "
    L"      </characteristic> "
    L
"   </characteristic>"
    L
"</wap-provisioningdoc>";
 
HRESULT AddFavorite()
{
    HRESULT hr         
= E_FAIL;
    LPWSTR wszOutput   
= NULL;
    hr 
= DMProcessConfigXML(g_wszFavoriteXml, CFGFLAG_PROCESS, &wszOutput);
    
// 删除这里没用到的返回值,它仍是一个XML串
    delete [] wszOutput;
    
return hr;
}

在Windows Mobile 5以后的设备中也提供了这个方法的托管封装,即ConfigurationManage类的ProcessConfiguration静态方法。

使用CSP来删除特定的应用程序

 

     首先,需要查询该应用程序能否被删除,实际上我们在通过Visual Studio制作安装包(CAB)的时候会有这个选项,也就是说你可以让你的程序是不可被删除的(不可通过系统的删除程序来删除)。这里,通过CSP我们同样只能卸载那些允许被卸载的程序。MSDN里面给了一个例子,用来查询能被删除的程序,我们的程序可以参考这个例子入手。我预先随便创建了一个Smart Device CAB项目,命名叫”TestCAB”。参考例子,容易写出C#代码如下:

 

ContractedBlock.gif
ExpandedBlockStart.gif
Code
            String query = "<wap-provisioningdoc><characteristic type=\"UnInstall\"><characteristic-query type=\"TestCAB\"/></characteristic></wap-provisioningdoc>";
            XmlDocument xDoc 
= new XmlDocument();
            xDoc.LoadXml(query);
            xDoc 
= ConfigurationManager.ProcessConfiguration(xDoc, true);

返回的xDoc却是这样的:

 

图2

      图2所示结果和MSDN的Example中给的可不太一样,于是我去系统自带的“删除程序”中看了一下,如图1,原来这里的删除程序的名称是CAB包的名称加上Manufacturer的名字。这两个名称你既可以在Visual Studio创建CAB项目时候设置。编译之后,可以在CAB所在目录下找到一个inf文件,里面包含了安装信息。你可以找到AppName和Manufacturer两项察看,如下:

[CEStrings]

AppName="TestCAB"

InstallDir=%CE1%\%AppName%

[Strings]

Manufacturer="Freesc" 

所以这里,我们只需要修改原程序中XML查询串为:

“<wap-provisioningdoc><characteristic type=\"UnInstall\"><characteristic-query type=\"Freesc TestCAB\"/></characteristic></wap-provisioningdoc>”

即可得到正确的返回值如下:

图3

比较图2和图3,只要随便解析一下这个XML返回值就可以得知某应用程序的安装情况了,比如这里我们可以判断xmlDocument.SelectSingleNode("//characteristic/characteristic")是否返回空,从而得知应用程序是否安装并允许卸载。下面的程序演示了如何卸载Test App:

ContractedBlock.gif
ExpandedBlockStart.gif
Code
            doc = new XmlDocument();
            
string xml = @"
<wap-provisioningdoc>
    <characteristic type=""UnInstall"" >
        <characteristic type=""Freesc TestCAB"" >
            <parm name=""uninstall"" value=""1"" />
        </characteristic>
    </characteristic>
</wap-provisioningdoc>
";
            doc.LoadXml(xml
);
            ConfigurationManager.ProcessConfiguration(doc, 
true);

 

编写自己的应用程序管理器

 了解了上述内容,你也可以轻松的编写出你自己的应用程序管理器了, 下面是一个简单的示例, 代码在后面的链接中下载:

 

完整的代码:

;-)

 

你可能感兴趣的文章
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>