【问题标题】:Reboot on installation of .CAB WM安装 .CAB WM 时重新启动
【发布时间】:2011-04-09 02:10:31
【问题描述】:

在 Windows Mobile 6 或 CE 5 设备上,我需要安装 CAB 文件,然后启动重新启动。

我知道自定义操作。您需要在本机 C++ 中为 CAB 文件创建 setup.dll。

所以我已经制作了以下代码

codeINSTALL_EXIT Install_Exit(HWND hwndParent,
                              LPCTSTR pszInstallDir,
                              WORD cFailedDirs,
                              WORD cFailedFiles,
                              WORD cFailedRegKeys,
                              WORD cFailedRegVals,
                              WORD cFailedShortcuts)
{
    MessageBox(hwndParent,
               _T("A reboot is required to complete installation, Press OK to reboot."),
               _T("Reboot required"),
               MB_OK);
    SetSystemPowerState(NULL, POWER_STATE_RESET, 0);
    return codeINSTALL_EXIT_DONE;
}

SetSystemPowerState 将对设备进行热启动。问题是由于安装未完成(未达到返回码INSTALL_EXIT_DONE),它会抱怨当您稍后尝试将其删除时无法安装该应用程序。删除重新启动是解决此问题的即时方法。

我在其他 .CAB 安装上看到了一条礼貌的消息,上面写着 "A restart is required to complete installation...",没有确定/取消按钮。然后设备在显示消息两秒钟后重新启动。此外,可以毫无问题地卸载此软件。

我希望实现与上述其他 CAB 文件相同的功能,一个超时系统弹出窗口,然后重新启动,并能够从设备上的删除程序选项中卸载应用程序。


我昨天发现的另一个可能的解决方案是返回 CONFIG_S_REBOOTREQUIRED。但是,这没有定义,因此不会编译。 codeINSTALL_EXIT 的定义返回如下。

Using typedef enum
{
    codeINSTALL_EXIT_DONE       = 0,    // @comm Exit the installation successfully
    codeINSTALL_EXIT_UNINSTALL          // @comm Uninstall the application before exiting the installation
}
codeINSTALL_EXIT;

【问题讨论】:

  • 平台生成器:PUBLIC\CELLCORE\SIMTKIT\cfgmgrcopy.h:#define CONFIG_S_REBOOTREQUIRED 0x00042010
  • 哦,没有平台构建器的驱动程序开发的乐趣:) 我在那里找到了很多必需的文件。我已经在 CONFIG_S_REBOOTREQUIRED 中添加了,现在尝试一下

标签: c++ deployment windows-mobile installation cab


【解决方案1】:

this线程我了解到,需要通知安装过程安装 CAB 包后需要重新启动。

所以不是codeINSTALL_EXIT_DONE,而是返回CONFIG_S_REBOOTREQUIRED(没有SetSystemPowerState)。

我通常使用 ExitWindowsEx 而不是 SetSystemPowerState.ExitWindowsEx(EWX_REBOOT | EWX_DEFER, 0); 重新启动 Windows。应该异步重启,让设置过程有时间完成。

【讨论】:

  • 嗨,我应该提到我已经尝试过上述方法。 CONFIG_S_REBOOTREQUIRED 未定义。我会在我的问题中添加一些可读的代码,这样你就可以看到它
  • CONFIG_S_REBOOTREQUIRED 可能在 Windows CE Platform Builder 中找到 microsoft.com/downloads/…
  • CONFIG_S_REBOOTREQUIRED 在 CE5 或 WM6 上不起作用,我将其添加到返回的 codeInstall_EXIT 枚举中。但是 ExitWindowsEx 确实有效,我将改用它(至少在 WM6 上,因为它在 CE5 上不受支持) 至于我的卸载问题,我想我已经追踪到重启不是根本原因。根本原因是 CAB 安装到驱动程序/内置,因此在“重新启动”时,BUSENUM (device.exe) 保留所有这些子项的打开句柄。一个打开的子项会阻止 cab 卸载注册表项,但它会因此而失败。我将在 setup.dll 而不是 cab 向导中创建密钥
  • 似乎 ExitWindowsEx 在 Windows Mobile 5.0 平台上受支持,而不是在 Windows CE 5.0 上。疯了:)
  • 我只能在 Windows CE6 cellcore 下找到定义 - 确切地说是 SIMTKIT - 你可以试试:#define CONFIG_S_REBOOTREQUIRED 0x00042010 - 应该在发布之前刷新页面...... :)
猜你喜欢
  • 2011-07-10
  • 2013-02-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-14
  • 2015-03-18
相关资源
最近更新 更多