*** empty log message ***

svn path=/trunk/boinc/; revision=5368
This commit is contained in:
Rom Walton 2005-02-09 01:14:14 +00:00
parent 5a2a60ad91
commit 6049c6756f
14 changed files with 541 additions and 63 deletions

View File

@ -24291,3 +24291,30 @@ David 8 Feb 2005
setup_project.py setup_project.py
tools/ tools/
make_project make_project
Rom 8 Feb 2005
- Bug Fix: Add the ability for setup to shutdown any running instances
of the BOINC Manager during install and uninstall.
- Bug Fix: Change "Launch the program" to "Launch the BOINC Manager"
- Bug Fix: Fix a number of event bubble up issues with the base
wxTaskBarEx class, the sample format provided with the wxWidget
framework leads down the wrong path if you try to extend the class.
- Bug Fix: Add another custom action dll to do the actual shutdown
of the BOINC Manager
clientgui/
BOINCGUIApp.cpp
BOINCTaskBar.cpp, .h
clientgui/msw/
taskbarex.cpp, .h
win_build/installerv2/
BOINC.ism
win_build/installerv2/Windows/src/ShutdownBOINCManager
ShutdownBOINCManager.cpp ( added )
ShutdownBOINCManager.def ( added )
ShutdownBOINCManager.sln ( added )
ShutdownBOINCManager.vcproj ( added )
stdafx.cpp, .h ( added )
win_build/installerv2/Windows/x86/
shutdown.dll

View File

@ -99,6 +99,7 @@ bool CBOINCGUIApp::OnInit()
wxLog::SetActiveTarget(m_pLog); wxLog::SetActiveTarget(m_pLog);
m_pLog->AddTraceMask( wxT("Function Start/End") ); m_pLog->AddTraceMask( wxT("Function Start/End") );
m_pLog->AddTraceMask( wxT("Function Status") );
// Enable the in memory virtual file system for // Enable the in memory virtual file system for
// storing images // storing images

View File

@ -38,6 +38,11 @@ BEGIN_EVENT_TABLE (CTaskBarIcon, wxTaskBarIconEx)
EVT_MENU_RANGE(ID_TB_NETWORKRUNALWAYS, ID_TB_NETWORKSUSPEND, CTaskBarIcon::OnNetworkSelection) EVT_MENU_RANGE(ID_TB_NETWORKRUNALWAYS, ID_TB_NETWORKSUSPEND, CTaskBarIcon::OnNetworkSelection)
EVT_MENU(wxID_ABOUT, CTaskBarIcon::OnAbout) EVT_MENU(wxID_ABOUT, CTaskBarIcon::OnAbout)
EVT_MENU(wxID_EXIT, CTaskBarIcon::OnExit) EVT_MENU(wxID_EXIT, CTaskBarIcon::OnExit)
#ifdef __WXMSW__
EVT_TASKBAR_SHUTDOWN(CTaskBarIcon::OnShutdown)
#endif
EVT_IDLE(CTaskBarIcon::OnIdle) EVT_IDLE(CTaskBarIcon::OnIdle)
EVT_CLOSE(CTaskBarIcon::OnClose) EVT_CLOSE(CTaskBarIcon::OnClose)
EVT_TASKBAR_MOVE(CTaskBarIcon::OnMouseMove) EVT_TASKBAR_MOVE(CTaskBarIcon::OnMouseMove)
@ -53,7 +58,7 @@ END_EVENT_TABLE ()
CTaskBarIcon::CTaskBarIcon() : CTaskBarIcon::CTaskBarIcon() :
wxTaskBarIconEx() wxTaskBarIconEx( wxT("BOINCManagerSystray") )
{ {
m_iconTaskBarIcon = wxIcon( boinc_xpm ); m_iconTaskBarIcon = wxIcon( boinc_xpm );
m_dtLastHoverDetected = wxDateTime( (time_t)0 ); m_dtLastHoverDetected = wxDateTime( (time_t)0 );
@ -146,19 +151,40 @@ void CTaskBarIcon::OnAbout( wxCommandEvent& WXUNUSED(event) )
} }
void CTaskBarIcon::OnExit( wxCommandEvent& WXUNUSED(event) ) void CTaskBarIcon::OnExit( wxCommandEvent& event )
{ {
ResetTaskBar(); wxLogTrace(wxT("Function Start/End"), wxT("CTaskBarIcon::OnExit - Function Begin"));
CMainFrame* pFrame = wxGetApp().GetFrame(); wxCloseEvent eventClose;
wxASSERT(NULL != pFrame);
wxASSERT(wxDynamicCast(pFrame, CMainFrame));
if ( NULL != pFrame ) OnClose( eventClose );
pFrame->Close(true);
if ( eventClose.GetSkipped() ) event.Skip();
wxLogTrace(wxT("Function Start/End"), wxT("CTaskBarIcon::OnExit - Function End"));
} }
#ifdef __WXMSW__
void CTaskBarIcon::OnShutdown( wxTaskBarIconExEvent& event )
{
wxLogTrace(wxT("Function Start/End"), wxT("CTaskBarIcon::OnShutdown - Function Begin"));
wxCloseEvent eventClose;
OnClose( eventClose );
if ( eventClose.GetSkipped() ) event.Skip();
wxLogTrace(wxT("Function Start/End"), wxT("CTaskBarIcon::OnShutdown - Function End"));
}
#endif
void CTaskBarIcon::OnIdle( wxIdleEvent& event ) void CTaskBarIcon::OnIdle( wxIdleEvent& event )
{ {
wxGetApp().UpdateSystemIdleDetection(); wxGetApp().UpdateSystemIdleDetection();
@ -168,6 +194,8 @@ void CTaskBarIcon::OnIdle( wxIdleEvent& event )
void CTaskBarIcon::OnClose( wxCloseEvent& event ) void CTaskBarIcon::OnClose( wxCloseEvent& event )
{ {
wxLogTrace(wxT("Function Start/End"), wxT("CTaskBarIcon::OnClose - Function Begin"));
ResetTaskBar(); ResetTaskBar();
CMainFrame* pFrame = wxGetApp().GetFrame(); CMainFrame* pFrame = wxGetApp().GetFrame();
@ -178,6 +206,8 @@ void CTaskBarIcon::OnClose( wxCloseEvent& event )
pFrame->Close(true); pFrame->Close(true);
event.Skip(); event.Skip();
wxLogTrace(wxT("Function Start/End"), wxT("CTaskBarIcon::OnClose - Function End"));
} }

View File

@ -44,6 +44,9 @@ public:
void OnNetworkSelection( wxCommandEvent& event ); void OnNetworkSelection( wxCommandEvent& event );
void OnAbout( wxCommandEvent& event ); void OnAbout( wxCommandEvent& event );
void OnExit( wxCommandEvent& event ); void OnExit( wxCommandEvent& event );
#ifdef __WXMSW__
void OnShutdown( wxTaskBarIconExEvent& event );
#endif
void OnIdle( wxIdleEvent& event ); void OnIdle( wxIdleEvent& event );
void OnClose( wxCloseEvent& event ); void OnClose( wxCloseEvent& event );

View File

@ -20,7 +20,10 @@
LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam ); LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam );
wxChar *wxTaskBarExWindowClass = (wxChar*) wxT("wxTaskBarExWindowClass"); wxChar *wxTaskBarExWindowClass = (wxChar*) wxT("wxTaskBarExWindowClass");
wxChar *wxTaskBarExWindow = (wxChar*) wxT("wxTaskBarExWindow");
const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(wxT("TaskbarCreated")); const UINT WM_TASKBARCREATED = ::RegisterWindowMessage(wxT("TaskbarCreated"));
const UINT WM_TASKBARSHUTDOWN = ::RegisterWindowMessage(wxT("TaskbarShutdown"));
wxList wxTaskBarIconEx::sm_taskBarIcons; wxList wxTaskBarIconEx::sm_taskBarIcons;
bool wxTaskBarIconEx::sm_registeredClass = FALSE; bool wxTaskBarIconEx::sm_registeredClass = FALSE;
@ -34,6 +37,7 @@ DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_SHOW )
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_HIDE ) DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_HIDE )
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_TIMEOUT ) DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_TIMEOUT )
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_USERCLICK ) DEFINE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_USERCLICK )
DEFINE_EVENT_TYPE( wxEVT_TASKBAR_SHUTDOWN )
IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIconEx, wxEvtHandler) IMPLEMENT_DYNAMIC_CLASS(wxTaskBarIconEx, wxEvtHandler)
@ -51,7 +55,18 @@ wxTaskBarIconEx::wxTaskBarIconEx(void)
AddObject(this); AddObject(this);
if (RegisterWindowClass()) if (RegisterWindowClass())
m_hWnd = CreateTaskBarWindow(); m_hWnd = CreateTaskBarWindow( wxTaskBarExWindow );
}
wxTaskBarIconEx::wxTaskBarIconEx( wxChar* szWindowTitle )
{
m_hWnd = 0;
m_iconAdded = FALSE;
AddObject(this);
if (RegisterWindowClass())
m_hWnd = CreateTaskBarWindow( szWindowTitle );
} }
wxTaskBarIconEx::~wxTaskBarIconEx(void) wxTaskBarIconEx::~wxTaskBarIconEx(void)
@ -73,8 +88,12 @@ wxTaskBarIconEx::~wxTaskBarIconEx(void)
// Events // Events
void wxTaskBarIconEx::OnClose(wxCloseEvent& event) void wxTaskBarIconEx::OnClose(wxCloseEvent& event)
{ {
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::OnClose - Function Begin"));
::DestroyWindow((HWND) m_hWnd); ::DestroyWindow((HWND) m_hWnd);
m_hWnd = 0; m_hWnd = 0;
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::OnClose - Function End"));
} }
void wxTaskBarIconEx::OnTaskBarCreated(wxTaskBarIconExEvent& event) void wxTaskBarIconEx::OnTaskBarCreated(wxTaskBarIconExEvent& event)
@ -293,12 +312,12 @@ bool wxTaskBarIconEx::RegisterWindowClass()
return( (rc != 0) ); return( (rc != 0) );
} }
WXHWND wxTaskBarIconEx::CreateTaskBarWindow() WXHWND wxTaskBarIconEx::CreateTaskBarWindow( wxChar* szWindowTitle )
{ {
HINSTANCE hInstance = GetModuleHandle(NULL); HINSTANCE hInstance = GetModuleHandle(NULL);
HWND hWnd = CreateWindowEx (0, wxTaskBarExWindowClass, HWND hWnd = CreateWindowEx (0, wxTaskBarExWindowClass,
wxT("wxTaskBarExWindow"), szWindowTitle,
WS_OVERLAPPED, WS_OVERLAPPED,
0, 0,
0, 0,
@ -327,82 +346,108 @@ bool wxTaskBarIconEx::IsBalloonsSupported()
long wxTaskBarIconEx::WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wParam, long lParam ) long wxTaskBarIconEx::WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wParam, long lParam )
{ {
wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::WindowProc - Function Begin"));
wxEventType eventType = 0; wxEventType eventType = 0;
long lReturnValue = 0;
if (msg != sm_taskbarMsg) if ( WM_CLOSE == msg )
return DefWindowProc((HWND) hWnd, msg, wParam, lParam);
switch (lParam)
{ {
case WM_LBUTTONDOWN: wxLogTrace(wxT("Function Status"), wxT("wxTaskBarIconEx::WindowProc - WM_CLOSE Detected"));
eventType = wxEVT_TASKBAR_LEFT_DOWN;
break; wxCloseEvent eventClose(wxEVT_CLOSE_WINDOW, hWnd);
ProcessEvent(eventClose);
case WM_LBUTTONUP: if ( !eventClose.GetSkipped() )
eventType = wxEVT_TASKBAR_LEFT_UP; lReturnValue = DefWindowProc((HWND) hWnd, msg, wParam, lParam);
break; else
lReturnValue = 0;
}
else if ( WM_TASKBARCREATED == msg )
{
wxLogTrace(wxT("Function Status"), wxT("wxTaskBarIconEx::WindowProc - WM_TASKBARCREATED Detected"));
eventType = wxEVT_TASKBAR_CREATED;
}
else if ( WM_TASKBARSHUTDOWN == msg )
{
wxLogTrace(wxT("Function Status"), wxT("wxTaskBarIconEx::WindowProc - WM_TASKBARSHUTDOWN Detected"));
eventType = wxEVT_TASKBAR_SHUTDOWN;
}
if (msg != sm_taskbarMsg)
lReturnValue = DefWindowProc((HWND) hWnd, msg, wParam, lParam);
case WM_RBUTTONDOWN: if ( 0 == eventType )
eventType = wxEVT_TASKBAR_RIGHT_DOWN; {
break; switch (lParam)
{
case WM_LBUTTONDOWN:
eventType = wxEVT_TASKBAR_LEFT_DOWN;
break;
case WM_RBUTTONUP: case WM_LBUTTONUP:
eventType = wxEVT_TASKBAR_RIGHT_UP; eventType = wxEVT_TASKBAR_LEFT_UP;
break; break;
case WM_LBUTTONDBLCLK: case WM_RBUTTONDOWN:
eventType = wxEVT_TASKBAR_LEFT_DCLICK; eventType = wxEVT_TASKBAR_RIGHT_DOWN;
break; break;
case WM_RBUTTONDBLCLK: case WM_RBUTTONUP:
eventType = wxEVT_TASKBAR_RIGHT_DCLICK; eventType = wxEVT_TASKBAR_RIGHT_UP;
break; break;
case WM_MOUSEMOVE: case WM_LBUTTONDBLCLK:
eventType = wxEVT_TASKBAR_MOVE; eventType = wxEVT_TASKBAR_LEFT_DCLICK;
break; break;
case WM_CONTEXTMENU: case WM_RBUTTONDBLCLK:
eventType = wxEVT_TASKBAR_CONTEXT_MENU; eventType = wxEVT_TASKBAR_RIGHT_DCLICK;
break; break;
case NIN_SELECT: case WM_MOUSEMOVE:
eventType = wxEVT_TASKBAR_SELECT; eventType = wxEVT_TASKBAR_MOVE;
break; break;
case NIN_KEYSELECT: case WM_CONTEXTMENU:
eventType = wxEVT_TASKBAR_KEY_SELECT; eventType = wxEVT_TASKBAR_CONTEXT_MENU;
break; break;
case NIN_BALLOONSHOW: case NIN_SELECT:
eventType = wxEVT_TASKBAR_BALLOON_SHOW; eventType = wxEVT_TASKBAR_SELECT;
break; break;
case NIN_BALLOONHIDE: case NIN_KEYSELECT:
eventType = wxEVT_TASKBAR_BALLOON_HIDE; eventType = wxEVT_TASKBAR_KEY_SELECT;
break; break;
case NIN_BALLOONTIMEOUT: case NIN_BALLOONSHOW:
eventType = wxEVT_TASKBAR_BALLOON_TIMEOUT; eventType = wxEVT_TASKBAR_BALLOON_SHOW;
break; break;
case NIN_BALLOONUSERCLICK: case NIN_BALLOONHIDE:
eventType = wxEVT_TASKBAR_BALLOON_USERCLICK; eventType = wxEVT_TASKBAR_BALLOON_HIDE;
break; break;
default: case NIN_BALLOONTIMEOUT:
if ( WM_TASKBARCREATED == lParam ) eventType = wxEVT_TASKBAR_BALLOON_TIMEOUT;
eventType = wxEVT_TASKBAR_CREATED; break;
break;
case NIN_BALLOONUSERCLICK:
eventType = wxEVT_TASKBAR_BALLOON_USERCLICK;
break;
}
} }
if (eventType) if (eventType)
{ {
wxTaskBarIconExEvent event(eventType, this); wxTaskBarIconExEvent event(eventType, this);
ProcessEvent(event); ProcessEvent(event);
lReturnValue = 0;
} }
return 0; wxLogTrace(wxT("Function Start/End"), wxT("wxTaskBarIconEx::WindowProc - Function End"));
return lReturnValue;
} }
LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam ) LRESULT APIENTRY wxTaskBarIconExWindowProc( HWND hWnd, unsigned msg, UINT wParam, LONG lParam )

View File

@ -26,7 +26,10 @@ class wxTaskBarIconExEvent;
class wxTaskBarIconEx: public wxEvtHandler { class wxTaskBarIconEx: public wxEvtHandler {
DECLARE_DYNAMIC_CLASS(wxTaskBarIconEx) DECLARE_DYNAMIC_CLASS(wxTaskBarIconEx)
public: public:
wxTaskBarIconEx(void); wxTaskBarIconEx(void);
wxTaskBarIconEx( wxChar* szWindowTitle );
virtual ~wxTaskBarIconEx(void); virtual ~wxTaskBarIconEx(void);
enum ICONTYPES enum ICONTYPES
@ -69,7 +72,7 @@ public:
static void AddObject(wxTaskBarIconEx* obj); static void AddObject(wxTaskBarIconEx* obj);
static void RemoveObject(wxTaskBarIconEx* obj); static void RemoveObject(wxTaskBarIconEx* obj);
static bool RegisterWindowClass(); static bool RegisterWindowClass();
static WXHWND CreateTaskBarWindow(); static WXHWND CreateTaskBarWindow( wxChar* szWindowTitle );
static bool IsBalloonsSupported(); static bool IsBalloonsSupported();
long WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wParam, long lParam ); long WindowProc( WXHWND hWnd, unsigned int msg, unsigned int wParam, long lParam );
@ -114,6 +117,7 @@ DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_SHOW, 1561 )
DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_HIDE, 1562 ) DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_HIDE, 1562 )
DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_TIMEOUT, 1563 ) DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_TIMEOUT, 1563 )
DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_USERCLICK, 1564 ) DECLARE_EVENT_TYPE( wxEVT_TASKBAR_BALLOON_USERCLICK, 1564 )
DECLARE_EVENT_TYPE( wxEVT_TASKBAR_SHUTDOWN, 1565 )
END_DECLARE_EVENT_TYPES() END_DECLARE_EVENT_TYPES()
#define EVT_TASKBAR_CREATED(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_CREATED, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL), #define EVT_TASKBAR_CREATED(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_CREATED, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
@ -124,6 +128,7 @@ END_DECLARE_EVENT_TYPES()
#define EVT_TASKBAR_BALLOON_HIDE(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_BALLOON_HIDE, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL), #define EVT_TASKBAR_BALLOON_HIDE(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_BALLOON_HIDE, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#define EVT_TASKBAR_BALLOON_TIMEOUT(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_BALLOON_TIMEOUT, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL), #define EVT_TASKBAR_BALLOON_TIMEOUT(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_BALLOON_TIMEOUT, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#define EVT_TASKBAR_CONTEXT_USERCLICK(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_BALLOON_USERCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL), #define EVT_TASKBAR_CONTEXT_USERCLICK(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_BALLOON_USERCLICK, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#define EVT_TASKBAR_SHUTDOWN(fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_TASKBAR_SHUTDOWN, -1, -1, (wxObjectEventFunction) (wxEventFunction) &fn, NULL),
#endif #endif

Binary file not shown.

View File

@ -0,0 +1,145 @@
// ShutdownBOINCManager.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
/////////////////////////////////////////////////////////////////////
//
// Function: LogError
//
// Description: This function writes to the MSI log file and displays
// the SetupError dialog box as appropriate.
//
/////////////////////////////////////////////////////////////////////
int LogError(
MSIHANDLE hInstall, // handle to the installation session
UINT msgType, // message type to send to Windows Installer
UINT pbStyle, // push button sstyle to use in message box
UINT iconStyle, // icon style to use in message box
int errNum, // number of error in Error table
TCHAR* ActionName, // name of the custom action causing error
TCHAR* ErrorDesc, // description of the error
int statuscode // the return value from an api
)
{
PMSIHANDLE hRec; // handle to a record object
TCHAR frmtString[4096]; // string to use in field 0
switch(msgType)
{
// Send informational message to the log file
case INSTALLMESSAGE_INFO:
// generate the format string for field 0
_tcscpy(frmtString, _T("Custom Message : "));
_tcscat(frmtString, _T("Action Name: [1] "));
_tcscat(frmtString, _T("Description: [2] "));
_tcscat(frmtString, _T("Status Code: [3] "));
hRec = MsiCreateRecord(3);
MsiRecordSetString(hRec, 0, frmtString);
MsiRecordSetString(hRec, 1, ActionName);
MsiRecordSetString(hRec, 2, ErrorDesc);
MsiRecordSetInteger(hRec, 3, statuscode);
// returns IDOK if successful
return (MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO,
hRec));
break;
// Display a dialog and send error message to log file
case INSTALLMESSAGE_ERROR:
case INSTALLMESSAGE_WARNING:
case INSTALLMESSAGE_USER:
hRec = MsiCreateRecord(4);
MsiRecordSetInteger(hRec, 1, errNum);
MsiRecordSetString(hRec, 2, ActionName);
MsiRecordSetString(hRec, 3, ErrorDesc);
MsiRecordSetInteger(hRec, 4, statuscode);
// Return value to indicate which button is
// pushed on message box
return (MsiProcessMessage(hInstall,
INSTALLMESSAGE(msgType|pbStyle|iconStyle), hRec));
break;
}
return 0;
}
/////////////////////////////////////////////////////////////////////
//
// Function: ShutdownBOINCManager
//
// Description: This custom action shuts down the BOINC Manager.
//
/////////////////////////////////////////////////////////////////////
UINT __stdcall ShutdownBOINCManager(MSIHANDLE hInstall)
{
HWND hWndBOINCManagerSystray = NULL;
LRESULT lrReturnValue = NULL;
UINT uiLoopCounter = 0;
UINT uiReturn = -1;
const UINT WM_TASKBARSHUTDOWN = ::RegisterWindowMessage(_T("TaskbarShutdown"));
do
{
hWndBOINCManagerSystray = FindWindow( _T("wxTaskBarExWindowClass"), _T("BOINCManagerSystray") );
if ( NULL != hWndBOINCManagerSystray )
{
lrReturnValue = SendMessage( hWndBOINCManagerSystray, WM_TASKBARSHUTDOWN, NULL, NULL );
if ( 0 != lrReturnValue )
{
LogError(
hInstall,
INSTALLMESSAGE_ERROR,
NULL,
NULL,
NULL,
_T("ShutdownBOINCManager"),
_T("Setup was unable to shutdown the BOINC Manager Systray window."),
(int)lrReturnValue
);
return ERROR_INSTALL_FAILURE;
}
Sleep(1000);
}
uiLoopCounter++;
}
while ( (NULL != hWndBOINCManagerSystray) && ( 20 >= uiLoopCounter ) );
if ( NULL != hWndBOINCManagerSystray )
{
LogError(
hInstall,
INSTALLMESSAGE_ERROR,
NULL,
NULL,
NULL,
_T("ShutdownBOINCManager"),
_T("One or more BOINC Manager applications could not be closed, please close them and then rerun setup."),
uiLoopCounter
);
return ERROR_INSTALL_FAILURE;
}
// Give the manager a few seconds to shutdown.
Sleep(5000);
return ERROR_SUCCESS;
}
const char *BOINC_RCSID_eeaf7c4c79 = "$Id$";

View File

@ -0,0 +1,8 @@
;
; Module definition file for the shutdown.dll
;
LIBRARY shutdown
EXPORTS
ShutdownBOINCManager PRIVATE

View File

@ -0,0 +1,21 @@
Microsoft Visual Studio Solution File, Format Version 8.00
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ShutdownBOINCManager", "ShutdownBOINCManager.vcproj", "{49723CA5-DA05-43C0-93AB-6FD30D046919}"
ProjectSection(ProjectDependencies) = postProject
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfiguration) = preSolution
Debug = Debug
Release = Release
EndGlobalSection
GlobalSection(ProjectConfiguration) = postSolution
{49723CA5-DA05-43C0-93AB-6FD30D046919}.Debug.ActiveCfg = Debug|Win32
{49723CA5-DA05-43C0-93AB-6FD30D046919}.Debug.Build.0 = Debug|Win32
{49723CA5-DA05-43C0-93AB-6FD30D046919}.Release.ActiveCfg = Release|Win32
{49723CA5-DA05-43C0-93AB-6FD30D046919}.Release.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
EndGlobalSection
GlobalSection(ExtensibilityAddIns) = postSolution
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,161 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="ShutdownBOINCManager"
ProjectGUID="{49723CA5-DA05-43C0-93AB-6FD30D046919}"
Keyword="Win32Proj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="2"
CharacterSet="1">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;SHUTDOWN_EXPORTS"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="msi.lib"
OutputFile="$(OutDir)/shutdown.dll"
LinkIncremental="2"
ModuleDefinitionFile="ShutdownBOINCManager.def"
GenerateDebugInformation="TRUE"
ProgramDatabaseFile="$(OutDir)/shutdown.pdb"
SubSystem="2"
ImportLibrary="$(OutDir)/shutdown.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="2"
CharacterSet="1">
<Tool
Name="VCCLCompilerTool"
Optimization="2"
InlineFunctionExpansion="1"
OmitFramePointers="TRUE"
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;SHUTDOWN_EXPORTS"
StringPooling="TRUE"
RuntimeLibrary="0"
EnableFunctionLevelLinking="TRUE"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="msi.lib"
OutputFile="$(OutDir)/shutdown.dll"
LinkIncremental="1"
ModuleDefinitionFile="ShutdownBOINCManager.def"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
ImportLibrary="$(OutDir)/shutdown.lib"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm">
<File
RelativePath="ShutdownBOINCManager.cpp">
</File>
<File
RelativePath="ShutdownBOINCManager.def">
</File>
<File
RelativePath="stdafx.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc">
<File
RelativePath="stdafx.h">
</File>
</Filter>
<Filter
Name="Resource Files"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe">
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -0,0 +1,10 @@
// stdafx.cpp : source file that includes just the standard includes
// NativeImage.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
const char *BOINC_RCSID_140925f16d = "$Id$";

View File

@ -0,0 +1,22 @@
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
// Need to specify the smallest version of Windows Installer
// that supports file hashing. This is version 2.0.
#define _WIN32_MSI 200
// Exclude rarely-used stuff from Windows headers
#define WIN32_LEAN_AND_MEAN
// Windows Header Files:
#include <windows.h>
#include <tchar.h>
#include <malloc.h>
#include <stdio.h>
#include <msiquery.h>
#include <ntsecapi.h>

Binary file not shown.