代码之家  ›  专栏  ›  技术社区  ›  Abhineet

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

  •  0
  • Abhineet  · 技术社区  · 10 年前

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

    已安装的应用程序包括 APP1.exe & APP2.exe .

    安装期间 应用程序1 & 应用程序2 另一个过程是 doJob.exe 存储在 应用程序1 & 应用程序2 .

    大体上 应用程序1 有自己的目录&同样适用于 应用程序2 .

    请注意:

    1. 应用程序1 & 应用程序2 内部启动上述流程 doJob.exe .
    2. 二者都 应用程序1 & 应用程序2 正在使用相同的名称在内部运行另一个进程,即。 doJob.exe .

    我所做的:

    1. 仅启动 应用程序1 其内部启动其相关流程 doJob.exe .

    2. 从…起 APP1.exe ,我打电话 DMProcessConfigXML 用于卸载的API 应用程序2 .

    3. 这样做应该会卸载 应用程序2 包括 doJob.exe 存在于…之下 应用程序2 目录

    观察结果:

    1. 使命感 DMP进程配置XML ,关闭 doJob.exe 与…有关 应用程序1 卸载的内容时 应用程序2 .

    预期:

    1. 它不应关闭 doJob.exe 与关联的进程 应用程序1 .

    代码如下所示:-

    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 回复  |  直到 10 年前
        1
  •  1
  •   Trevor Balcom    10 年前

    这是WCELOAD程序的行为,这是一个在幕后实际执行卸载的系统程序。参见备注部分 here 了解更多信息。

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