例子路径:D:\Program Files\Windows Mobile 6 SDK\Samples\Common\CPP\Win32\SetupDLL
在WinCE的安装工程(cab包)底下可以配置一个Setup.dll,这个东西在安装过程中被加载,并控制安装过程。
SetupDll.dll很简单里面只有四个函数:
SETUP_API codeINSTALL_INIT Install_Init(
HWND hwndParent,
BOOL fFirstCall,
BOOL fPreviouslyInstalled,
LPCTSTR pszInstallDir
)
SETUP_API codeINSTALL_EXIT Install_Exit(
HWND hwndParent,
LPCTSTR pszInstallDir,
WORD cFailedDirs,
WORD cFailedFiles,
WORD cFailedRegKeys,
WORD cFailedRegVals,
WORD cFailedShortcuts
)
SETUP_API codeUNINSTALL_INIT Uninstall_Init(
HWND hwndParent,
LPCTSTR pszInstallDir
)
SETUP_API codeUNINSTALL_EXIT Uninstall_Exit(
HWND hwndParent
)
基本的操作是这样:
在用户选择安装路径后,先执行Install_Init,在安装完成后,执行Install_Exit。
卸载时,先执行Uninstall_Init,在卸载完毕后执行Uninstall_Exit。
这里讨论一下,在安装过程中,遇到可能的情况以及传入函数的参数。
在第一次安装的时候,Install_Init会在用户选择安装路径后执行。
传入Install_Init的参数:
pszInstallDir为:用户刚选择的路径\Program Files\工程名
fFirstCall为TRUE
fPreviouslyInstall为FALSE
安装完成后,执行Install_Exit。
pszInstallDir为:用户选择的路径\Program Files\工程名
卸载时,Uninstall_Init被执行。
参数pszInstallDir为:用户安装时选择的路径\Program Files\工程名
之后执行Uninstall_Exit。
另一种情况,在用户用新的CAB对已有工程进行更新时:
系统先挂载新的CAB中的SetupDll.dll
进入新SetupDll.dll的Install_Init,传入的参数为:
pszInstallDir为:用户上次安装的路径\Program Files\工程名
fFirstCall为TRUE
fPreviouslyInstall为FALSE
之后会弹出询问用户是否卸载上次安装的对话框,如果选择“取消”则程序退出不会执行其他函数。
如果选择“确定”,则会挂载旧版本中的SetupDll.dll,进入Uninstall_Init,传入参数为:pszInstallDir为:用户上次安装的路径\Program Files\工程名
之后执行旧版本的Uninstall_Exit。
在卸载旧版本完毕后,又会出现让用户选择路径的界面:
之后又进入新版本的Install_Init,此时参数变为:
pszInstallDir为:用户新选择的路径\Program Files\工程名
fFirstCall为FALSE
fPreviouslyInstall为FALSE
安装完成后,执行Install_Exit。
pszInstallDir为:用户新选择的路径\Program Files\工程名
另外,在安装过程中,还可以通过注册表,进行新旧setupdll的交互。这种方法比较灵活,怎么方便怎么来吧\^o^/
阅读(1133) | 评论(0) | 转发(0) |