如果在WM / CE平台中用于卸载,DMProcessConfigXML将关闭正在运行的应用程序

时间:2014-08-28 05:35:26

标签: c++ process windows-mobile windows-ce uninstall

我有两个安装在WM / CE设备中的应用程序。

已安装的应用 APP1.exe &的 APP2.exe

安装 APP1 & APP2 另一个 doJob.exe 的进程存储在 的相应文件夹中APP1 &的 APP2 即可。

基本上 APP1 有自己的目录&同样适用于 APP2

请注意:

  1. APP1 & APP2 在内部启动上述过程 doJob.exe
  2. APP1 & APP2 使用相同名称在内部运行其他进程,即 doJob.exe
  3. 我做什么:

    1. 仅启动 APP1 ,在内部启动其关联的流程 doJob.exe

    2. APP1.exe ,我致电DMProcessConfigXML API以卸载 APP2

    3. 这样做会卸载 APP2 的完整内容,包括 doJob.exe APP2 目录下。

    4. 观察:

      1. 调用 DMProcessConfigXML ,关闭与 APP1 相关联的 doJob.exe 在卸载 APP2 的内容时。
      2. 预期:

        1. 不应关闭与 APP1 相关联的 doJob.exe 进程。
        2. 代码如下所示: -

          void UninstallApp(){    
                  wstring strRequest = 
                   L"<wap-provisioningdoc><characteristic type=\"UnInstall\">"
                   L"<characteristic type=\"\\Program Files\\APP2";
                  strRequest += L"\">"
                   L"<parm name=\"uninstall\" value=\"1\"/>"
                      L"</characteristic>"
                      L"</characteristic></wap-provisioningdoc>";
          
                  LPFN_DMPROCESS_CONFIGXML_T lpfn_dmprocess_configxml = NULL; 
                  HRESULT hr         = E_FAIL;
                  LPWSTR wszOutput   = NULL;
                  HMODULE hLib = LoadLibrary(TEXT("aygshell.dll"));
                  if (hLib)
                  {
                      lpfn_dmprocess_configxml = (LPFN_DMPROCESS_CONFIGXML_T)GetProcAddress(hLib, L"DMProcessConfigXML");
                      if (lpfn_dmprocess_configxml != NULL)
                      {
                          hr = lpfn_dmprocess_configxml(strRequest.c_str(), CFGFLAG_PROCESS, &wszOutput);
                      }
                  }
          
                  if (hLib)
                      FreeLibrary (hLib);
          
                  if (FAILED(hr) || !wszOutput )
                     MessageBox(NULL,L"Failed",L"Failed",MB_OK);
          
                  if ( wszOutput )
                    free( wszOutput );
          }
          

          没有任何线索。 请告诉我,我是否需要在上面的代码中更改XML属性中的内容,否则这是使用DMProcessConfigXML API的一个缺点。

1 个答案:

答案 0 :(得分:1)

这是WCELOAD程序的行为,这是系统程序实际在幕后进行卸载。有关详细信息,请参阅备注部分here

  

在Windows Mobile 5.0及更高版本中,使用Wceload.exe重新安装.cab文件时,Wceload.exe会在安装新版本之前卸载以前安装的.cab文件版本。 在此过程的卸载部分中,Wceload.exe根据文件名关闭使用.cab文件在目标设备上安装的所有当前正在运行的可执行文件。 Wceload.exe还会关闭作为文件操作目标的任何可执行文件,例如移动或复制。要关闭可执行文件,Wceload.exe会将WM_CLOSE发送到该进程拥有的所有顶级窗口。如果在收到WM_CLOSE消息后进程没有及时退出,则Wceload.exe通过调用TerminateProcess强制关闭它。 Wceload.exe不会尝试关闭目标设备上运行时映像中附带的可执行文件。