How do I add support for Vista Restart Manager to my application?AnswerApplications that use Windows Installer version 4.0 for installation and servicing on Windows Vista automatically use the Restart Manager to reduce system restarts. The default behavior on Windows Vista is to shut down applications rather than shut down and restart the operating system whenever possible. In order to add Restart Manager support to your application you must call the following Windows Vista API function: HRESULT WINAPI RegisterApplicationRestart(PCWSTR pwzCommandline, DWORD dwFlags); Also you must handle the following Windows message: WM_QUERYENDSESSION. RegisterApplicationRestart function will register your application with Windows Installer Restart Manager. The pwzCommandline parameter will be passed to your application when it will be automatically restarted by Restart Manager.
The dwFlags parameter can be set to 0. For additional details please see Microsoft Platform SDK documentation. If your application is built using Microsoft's Visual C++ 2005 all you have to do is call this function when your application starts. If you are using an earlier version of Visual C++ you need to make a stub function. Please see the example bellow for details on how to create such a stub.
...
typedef HRESULT (_stdcall *RegisterApplicationRestartT)(PCWSTR pwzCommandline, DWORD dwFlags);
...
HRESULT RegisterApplicationRestartStub(PCWSTR pwzCommandline, DWORD dwFlags)
{
HMODULE hModule = ::LoadLibrary(_T("kernel32.dll"));
if (hModule == NULL)
return E_FAIL;
RegisterApplicationRestartT proc =
reinterpret_cast<RegisterApplicationRestartT>(::GetProcAddress(hModule, "RegisterApplicationRestart"));
if (proc == NULL)
{
::FreeLibrary(hModule);
return E_FAIL;
}
HRESULT ret = (proc)(pwzCommandline, dwFlags);
::FreeLibrary(hModule);
return ret;
}When WM_QUERYENDSESSION message is received you need to save your application data. If you want your application to be automatically restarted return TRUE, otherwise return FALSE. This method applies to GUI applications. This message must be handled in the application's main window. If you return TRUE to WM_QUERYENDSESSION message, windows will close the application by sending WM_CLOSE to the main window.
Please see the bellow sample code in WTL as reference:
...
BEGIN_MSG_MAP(CMainDlg)
...
MESSAGE_HANDLER(WM_QUERYENDSESSION, OnQueryEndSession)
...
END_MSG_MAP()
...
LRESULT OnQueryEndSession(UINT /*uMsg*/, WPARAM /*wParam*/,
LPARAM /*lParam*/, BOOL & /*bHandled*/)
{
// Save your application's data
return TRUE; // allow automatic close
}
| |
|
| Privacy Policy | Windows Installer | Search Engine Ranking | Link Analyzer | ||
| © 2002 - 2008 Caphyon Ltd. Trademarks belong to their respective owners. All rights reserved. | ||