ATL to WinStd transition completed:

- COpList changed to comprise of std::unique_ptr objects instead of raw COperation* pointers, allowing auto-cleanup
- ATL::CAtlFile replaced with MSICA::CStream
- CComPtr and CComQIPtr replaced with winstd::com_obj
This commit is contained in:
Simon Rozman 2017-04-24 21:46:00 +02:00
parent a8b69efe02
commit 64296e1d3b
11 changed files with 532 additions and 670 deletions

View File

@ -36,7 +36,7 @@
</ItemDefinitionGroup>
<ItemDefinitionGroup>
<ClCompile>
<AdditionalIncludeDirectories>..\include;..\..\WinStd\include;..\..\atlex\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>..\include;..\..\WinStd\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>Use</PrecompiledHeader>
<PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
</ClCompile>

View File

@ -28,22 +28,18 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<UseOfAtl>Static</UseOfAtl>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<UseOfAtl>Static</UseOfAtl>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<UseOfAtl>Static</UseOfAtl>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<CharacterSet>Unicode</CharacterSet>
<UseOfAtl>Static</UseOfAtl>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">

File diff suppressed because it is too large Load Diff

View File

@ -20,6 +20,7 @@
#include "stdafx.h"
#pragma comment(lib, "msi.lib")
#pragma comment(lib, "shlwapi.lib")
namespace MSICA {
@ -94,50 +95,32 @@ COpList::COpList(int iTicks) : COperation(iTicks)
}
void COpList::Free()
DWORD COpList::LoadFromFile(LPCTSTR pszFileName)
{
for (auto i = begin(), i_end = end(); i != i_end; ++i) {
COperation *pOp = *i;
COpList *pOpList = dynamic_cast<COpList*>(pOp);
if (pOpList) {
// Recursivelly free sublists.
pOpList->Free();
}
delete pOp;
}
clear();
}
HRESULT COpList::LoadFromFile(LPCTSTR pszFileName)
{
HRESULT hr;
ATL::CAtlFile fSequence;
hr = fSequence.Create(pszFileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN);
if (FAILED(hr)) return hr;
CStream fSequence;
if (!fSequence.create(pszFileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN))
return GetLastError();
// Load operation sequence.
return fSequence >> *this;
if (!(fSequence >> *this))
return GetLastError();
return NO_ERROR;
}
HRESULT COpList::SaveToFile(LPCTSTR pszFileName) const
DWORD COpList::SaveToFile(LPCTSTR pszFileName) const
{
HRESULT hr;
ATL::CAtlFile fSequence;
hr = fSequence.Create(pszFileName, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN);
if (FAILED(hr)) return hr;
CStream fSequence;
if (!fSequence.create(pszFileName, GENERIC_WRITE, FILE_SHARE_READ, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN))
return GetLastError();
// Save execute sequence to file.
hr = fSequence << *this;
fSequence.Close();
DWORD dwResult = (fSequence << *this) ? NO_ERROR : GetLastError();
fSequence.free();
if (FAILED(hr)) ::DeleteFile(pszFileName);
return hr;
if (dwResult != NO_ERROR) ::DeleteFile(pszFileName);
return dwResult;
}
@ -156,8 +139,8 @@ HRESULT COpList::Execute(CSession *pSession)
::MsiRecordSetInteger(hRecordProg, 1, 2);
::MsiRecordSetInteger(hRecordProg, 3, 0);
for (auto i = cbegin(), i_end = cend(); i != i_end; ++i) {
COperation *pOp = *i;
for (auto op = cbegin(), op_end = cend(); op != op_end; ++op) {
COperation *pOp = op->get();
hr = pOp->Execute(pSession);
if (!pSession->m_bContinueOnError && FAILED(hr)) {
@ -168,7 +151,7 @@ HRESULT COpList::Execute(CSession *pSession)
::MsiRecordSetInteger(hRecordProg, 2, pOp->m_iTicks);
if (::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_PROGRESS, hRecordProg) == IDCANCEL)
return AtlHresultFromWin32(ERROR_INSTALL_USEREXIT);
return HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
}
::MsiRecordSetInteger(hRecordProg, 2, m_iTicks);
@ -190,23 +173,15 @@ CSession::CSession() :
}
CSession::~CSession()
{
m_olRollback.Free();
m_olCommit.Free();
}
////////////////////////////////////////////////////////////////////////////
// Helper functions
////////////////////////////////////////////////////////////////////////////
UINT SaveSequence(MSIHANDLE hInstall, LPCTSTR szActionExecute, LPCTSTR szActionCommit, LPCTSTR szActionRollback, const COpList &olExecute)
{
HRESULT hr;
UINT uiResult;
DWORD dwResult;
winstd::tstring sSequenceFilename;
ATL::CAtlFile fSequence;
PMSIHANDLE hRecordProg = ::MsiCreateRecord(3);
// Prepare our own sequence script file.
@ -220,8 +195,8 @@ UINT SaveSequence(MSIHANDLE hInstall, LPCTSTR szActionExecute, LPCTSTR szActionC
sSequenceFilename.assign(szBuffer.get(), wcsnlen(szBuffer.get(), MAX_PATH));
}
// Save execute sequence to file.
hr = olExecute.SaveToFile(sSequenceFilename.c_str());
if (SUCCEEDED(hr)) {
dwResult = olExecute.SaveToFile(sSequenceFilename.c_str());
if (dwResult == NO_ERROR) {
// Store sequence script file names to properties for deferred custiom actions.
uiResult = ::MsiSetProperty(hInstall, szActionExecute, sSequenceFilename.c_str());
if (uiResult == NO_ERROR) {
@ -256,7 +231,7 @@ UINT SaveSequence(MSIHANDLE hInstall, LPCTSTR szActionExecute, LPCTSTR szActionC
uiResult = ERROR_INSTALL_SCRIPT_WRITE;
::MsiRecordSetInteger(hRecordProg, 1, uiResult );
::MsiRecordSetString (hRecordProg, 2, sSequenceFilename.c_str());
::MsiRecordSetInteger(hRecordProg, 3, hr );
::MsiRecordSetInteger(hRecordProg, 3, dwResult );
::MsiProcessMessage(hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
}
@ -267,6 +242,7 @@ UINT SaveSequence(MSIHANDLE hInstall, LPCTSTR szActionExecute, LPCTSTR szActionC
UINT ExecuteSequence(MSIHANDLE hInstall)
{
UINT uiResult;
DWORD dwResult;
HRESULT hr;
BOOL bIsCoInitialized = SUCCEEDED(::CoInitialize(NULL));
winstd::tstring sSequenceFilename;
@ -277,8 +253,8 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
BOOL bIsCleanup = ::MsiGetMode(hInstall, MSIRUNMODE_COMMIT) || ::MsiGetMode(hInstall, MSIRUNMODE_ROLLBACK);
// Load operation sequence.
hr = lstOperations.LoadFromFile(sSequenceFilename.c_str());
if (SUCCEEDED(hr)) {
dwResult = lstOperations.LoadFromFile(sSequenceFilename.c_str());
if (dwResult == NO_ERROR) {
MSICA::CSession session;
session.m_hInstall = hInstall;
@ -293,7 +269,6 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
// Rollback action MUST be scheduled in InstallExecuteSequence before this action! Otherwise cleanup won't be performed in case this action execution failed.
LPCTSTR pszExtension = ::PathFindExtension(sSequenceFilename.c_str());
winstd::tstring sSequenceFilenameCM, sSequenceFilenameRB;
HRESULT hr;
sprintf(sSequenceFilenameRB, _T("%.*ls-rb%ls"), pszExtension - sSequenceFilename.c_str(), sSequenceFilename.c_str(), pszExtension);
sprintf(sSequenceFilenameCM, _T("%.*ls-cm%ls"), pszExtension - sSequenceFilename.c_str(), sSequenceFilename.c_str(), pszExtension);
@ -315,11 +290,11 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
));
// Save commit file first.
hr = session.m_olCommit.SaveToFile(sSequenceFilenameCM.c_str());
if (SUCCEEDED(hr)) {
dwResult = session.m_olCommit.SaveToFile(sSequenceFilenameCM.c_str());
if (dwResult == NO_ERROR) {
// Save rollback file next.
hr = session.m_olRollback.SaveToFile(sSequenceFilenameRB.c_str());
if (SUCCEEDED(hr)) {
dwResult = session.m_olRollback.SaveToFile(sSequenceFilenameRB.c_str());
if (dwResult == NO_ERROR) {
uiResult = NO_ERROR;
} else {
// Saving rollback file failed.
@ -327,7 +302,7 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
uiResult = ERROR_INSTALL_SCRIPT_WRITE;
::MsiRecordSetInteger(hRecordProg, 1, uiResult );
::MsiRecordSetString (hRecordProg, 2, sSequenceFilenameRB.c_str());
::MsiRecordSetInteger(hRecordProg, 3, hr );
::MsiRecordSetInteger(hRecordProg, 3, dwResult );
::MsiProcessMessage(hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
}
} else {
@ -336,7 +311,7 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
uiResult = ERROR_INSTALL_SCRIPT_WRITE;
::MsiRecordSetInteger(hRecordProg, 1, uiResult );
::MsiRecordSetString (hRecordProg, 2, sSequenceFilenameCM.c_str());
::MsiRecordSetInteger(hRecordProg, 3, hr );
::MsiRecordSetInteger(hRecordProg, 3, dwResult );
::MsiProcessMessage(hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
}
@ -358,7 +333,7 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
}
::DeleteFile(sSequenceFilename.c_str());
} else if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) && bIsCleanup) {
} else if (dwResult == ERROR_FILE_NOT_FOUND && bIsCleanup) {
// Sequence file not found and this is rollback/commit action. Either of the following scenarios are possible:
// - The delayed action failed to save the rollback/commit file. The delayed action performed cleanup itself. No further action is required.
// - Somebody removed the rollback/commit file between delayed action and rollback/commit action. No further action is possible.
@ -369,11 +344,9 @@ UINT ExecuteSequence(MSIHANDLE hInstall)
uiResult = ERROR_INSTALL_SCRIPT_READ;
::MsiRecordSetInteger(hRecordProg, 1, uiResult );
::MsiRecordSetString (hRecordProg, 2, sSequenceFilename.c_str());
::MsiRecordSetInteger(hRecordProg, 3, hr );
::MsiRecordSetInteger(hRecordProg, 3, dwResult );
::MsiProcessMessage(hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
}
lstOperations.Free();
} else {
// Couldn't get CustomActionData property. uiResult has the error code.
}

View File

@ -74,7 +74,7 @@ HRESULT COpCertInstall::Execute(CSession *pSession)
::CertGetNameStringW(pCertContext, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL, sCertName);
::MsiRecordSetStringW(hRecordMsg, 1, sCertName.c_str());
if (MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ACTIONDATA, hRecordMsg) == IDCANCEL)
return AtlHresultFromWin32(ERROR_INSTALL_USEREXIT);
return HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
// Add certificate to certificate store.
if (::CertAddCertificateContextToStore(hCertStore, pCertContext, CERT_STORE_ADD_NEW, NULL)) {
@ -105,7 +105,7 @@ HRESULT COpCertInstall::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 2, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 3, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}
@ -138,7 +138,7 @@ HRESULT COpCertRemove::Execute(CSession *pSession)
::CertGetNameStringW(pCertContext, CERT_NAME_FRIENDLY_DISPLAY_TYPE, 0, NULL, sCertName);
::MsiRecordSetStringW(hRecordMsg, 1, sCertName.c_str());
if (MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ACTIONDATA, hRecordMsg) == IDCANCEL)
return AtlHresultFromWin32(ERROR_INSTALL_USEREXIT);
return HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
pCertContextExisting = ::CertFindCertificateInStore(hCertStore, m_dwEncodingType, 0, CERT_FIND_EXISTING, pCertContext, NULL);
if (pCertContextExisting) {
@ -172,7 +172,7 @@ HRESULT COpCertRemove::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 2, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 3, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}

View File

@ -65,7 +65,7 @@ HRESULT COpFileDelete::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 2, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 3, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}
@ -100,7 +100,7 @@ HRESULT COpFileMove::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 3, m_sValue2.c_str() );
::MsiRecordSetInteger(hRecordProg, 4, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}

View File

@ -110,7 +110,7 @@ HRESULT COpRegKeyCreate::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 3, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 4, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -162,7 +162,7 @@ HRESULT COpRegKeyCopy::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 4, m_sValue2.c_str() );
::MsiRecordSetInteger(hRecordProg, 5, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -346,7 +346,7 @@ HRESULT COpRegKeyDelete::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 3, sBackupName.c_str() );
::MsiRecordSetInteger(hRecordProg, 4, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -363,7 +363,7 @@ HRESULT COpRegKeyDelete::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 3, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 4, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -555,7 +555,7 @@ HRESULT COpRegValueCreate::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 4, m_sValueName.c_str() );
::MsiRecordSetInteger(hRecordProg, 5, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -630,7 +630,7 @@ HRESULT COpRegValueCopy::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 5, m_sValueName2.c_str() );
::MsiRecordSetInteger(hRecordProg, 6, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -698,7 +698,7 @@ HRESULT COpRegValueDelete::Execute(CSession *pSession)
::MsiRecordSetInteger(hRecordProg, 4, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
::RegCloseKey(hKey);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}
@ -719,7 +719,7 @@ HRESULT COpRegValueDelete::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 4, m_sValueName.c_str() );
::MsiRecordSetInteger(hRecordProg, 5, lResult );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(lResult);
return HRESULT_FROM_WIN32(lResult);
}
}

View File

@ -90,7 +90,7 @@ HRESULT COpSvcSetStart::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 2, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 3, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}
@ -193,7 +193,7 @@ HRESULT COpSvcStart::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 2, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 3, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}
@ -248,7 +248,7 @@ HRESULT COpSvcStop::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 2, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 3, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
}

View File

@ -44,12 +44,12 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
{
HRESULT hr;
PMSIHANDLE hRecordMsg = ::MsiCreateRecord(1);
CComPtr<ITaskService> pService;
winstd::com_obj<ITaskService> pService;
// Display our custom message in the progress bar.
::MsiRecordSetStringW(hRecordMsg, 1, m_sValue.c_str());
if (MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ACTIONDATA, hRecordMsg) == IDCANCEL)
return AtlHresultFromWin32(ERROR_INSTALL_USEREXIT);
return HRESULT_FROM_WIN32(ERROR_INSTALL_USEREXIT);
{
// Delete existing task first.
@ -60,21 +60,21 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
if (FAILED(hr)) goto finish;
}
hr = pService.CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
hr = pService.create(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
if (SUCCEEDED(hr)) {
// Windows Vista or newer.
CComVariant vEmpty;
CComPtr<ITaskDefinition> pTaskDefinition;
CComPtr<ITaskSettings> pTaskSettings;
CComPtr<IPrincipal> pPrincipal;
CComPtr<IActionCollection> pActionCollection;
CComPtr<IAction> pAction;
CComPtr<IIdleSettings> pIdleSettings;
CComPtr<IExecAction> pExecAction;
CComPtr<IRegistrationInfo> pRegististrationInfo;
CComPtr<ITriggerCollection> pTriggerCollection;
CComPtr<ITaskFolder> pTaskFolder;
CComPtr<IRegisteredTask> pTask;
winstd::variant vEmpty;
winstd::com_obj<ITaskDefinition> pTaskDefinition;
winstd::com_obj<ITaskSettings> pTaskSettings;
winstd::com_obj<IPrincipal> pPrincipal;
winstd::com_obj<IActionCollection> pActionCollection;
winstd::com_obj<IAction> pAction;
winstd::com_obj<IIdleSettings> pIdleSettings;
winstd::com_obj<IExecAction> pExecAction;
winstd::com_obj<IRegistrationInfo> pRegististrationInfo;
winstd::com_obj<ITriggerCollection> pTriggerCollection;
winstd::com_obj<ITaskFolder> pTaskFolder;
winstd::com_obj<IRegisteredTask> pTask;
std::wstring str;
UINT iTrigger;
TASK_LOGON_TYPE logonType;
@ -108,7 +108,7 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
// Add execute action.
hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction);
if (FAILED(hr)) goto finish;
hr = pAction.QueryInterface(&pExecAction);
hr = pAction.query_interface(&pExecAction);
if (FAILED(hr)) goto finish;
// Configure the action.
@ -193,23 +193,23 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
// Add triggers.
iTrigger = 0;
for (auto t = m_lTriggers.cbegin(), t_end = m_lTriggers.cend(); t != t_end; ++t, iTrigger++) {
CComPtr<ITrigger> pTrigger;
winstd::com_obj<ITrigger> pTrigger;
const TASK_TRIGGER &ttData = *t;
switch (ttData.TriggerType) {
case TASK_TIME_TRIGGER_ONCE: {
CComPtr<ITimeTrigger> pTriggerTime;
winstd::com_obj<ITimeTrigger> pTriggerTime;
hr = pTriggerCollection->Create(TASK_TRIGGER_TIME, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerTime); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerTime); if (FAILED(hr)) goto finish;
sprintf(str, L"PT%uM", ttData.wRandomMinutesInterval);
hr = pTriggerTime->put_RandomDelay(winstd::bstr(str)); if (FAILED(hr)) goto finish;
break;
}
case TASK_TIME_TRIGGER_DAILY: {
CComPtr<IDailyTrigger> pTriggerDaily;
winstd::com_obj<IDailyTrigger> pTriggerDaily;
hr = pTriggerCollection->Create(TASK_TRIGGER_DAILY, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerDaily); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerDaily); if (FAILED(hr)) goto finish;
hr = pTriggerDaily->put_DaysInterval(ttData.Type.Daily.DaysInterval); if (FAILED(hr)) goto finish;
sprintf(str, L"PT%uM", ttData.wRandomMinutesInterval);
hr = pTriggerDaily->put_RandomDelay(winstd::bstr(str)); if (FAILED(hr)) goto finish;
@ -217,9 +217,9 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
}
case TASK_TIME_TRIGGER_WEEKLY: {
CComPtr<IWeeklyTrigger> pTriggerWeekly;
winstd::com_obj<IWeeklyTrigger> pTriggerWeekly;
hr = pTriggerCollection->Create(TASK_TRIGGER_WEEKLY, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerWeekly); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerWeekly); if (FAILED(hr)) goto finish;
hr = pTriggerWeekly->put_WeeksInterval(ttData.Type.Weekly.WeeksInterval); if (FAILED(hr)) goto finish;
hr = pTriggerWeekly->put_DaysOfWeek(ttData.Type.Weekly.rgfDaysOfTheWeek); if (FAILED(hr)) goto finish;
sprintf(str, L"PT%uM", ttData.wRandomMinutesInterval);
@ -228,9 +228,9 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
}
case TASK_TIME_TRIGGER_MONTHLYDATE: {
CComPtr<IMonthlyTrigger> pTriggerMonthly;
winstd::com_obj<IMonthlyTrigger> pTriggerMonthly;
hr = pTriggerCollection->Create(TASK_TRIGGER_MONTHLY, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerMonthly); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerMonthly); if (FAILED(hr)) goto finish;
hr = pTriggerMonthly->put_DaysOfMonth(ttData.Type.MonthlyDate.rgfDays); if (FAILED(hr)) goto finish;
hr = pTriggerMonthly->put_MonthsOfYear(ttData.Type.MonthlyDate.rgfMonths); if (FAILED(hr)) goto finish;
sprintf(str, L"PT%uM", ttData.wRandomMinutesInterval);
@ -239,9 +239,9 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
}
case TASK_TIME_TRIGGER_MONTHLYDOW: {
CComPtr<IMonthlyDOWTrigger> pTriggerMonthlyDOW;
winstd::com_obj<IMonthlyDOWTrigger> pTriggerMonthlyDOW;
hr = pTriggerCollection->Create(TASK_TRIGGER_MONTHLYDOW, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerMonthlyDOW); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerMonthlyDOW); if (FAILED(hr)) goto finish;
hr = pTriggerMonthlyDOW->put_WeeksOfMonth(
ttData.Type.MonthlyDOW.wWhichWeek == TASK_FIRST_WEEK ? 0x01 :
ttData.Type.MonthlyDOW.wWhichWeek == TASK_SECOND_WEEK ? 0x02 :
@ -261,18 +261,18 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
}
case TASK_EVENT_TRIGGER_AT_SYSTEMSTART: {
CComPtr<IBootTrigger> pTriggerBoot;
winstd::com_obj<IBootTrigger> pTriggerBoot;
hr = pTriggerCollection->Create(TASK_TRIGGER_BOOT, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerBoot); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerBoot); if (FAILED(hr)) goto finish;
sprintf(str, L"PT%uM", ttData.wRandomMinutesInterval);
hr = pTriggerBoot->put_Delay(winstd::bstr(str)); if (FAILED(hr)) goto finish;
break;
}
case TASK_EVENT_TRIGGER_AT_LOGON: {
CComPtr<ILogonTrigger> pTriggerLogon;
winstd::com_obj<ILogonTrigger> pTriggerLogon;
hr = pTriggerCollection->Create(TASK_TRIGGER_LOGON, &pTrigger); if (FAILED(hr)) goto finish;
hr = pTrigger.QueryInterface(&pTriggerLogon); if (FAILED(hr)) goto finish;
hr = pTrigger.query_interface(&pTriggerLogon); if (FAILED(hr)) goto finish;
sprintf(str, L"PT%uM", ttData.wRandomMinutesInterval);
hr = pTriggerLogon->put_Delay(winstd::bstr(str)); if (FAILED(hr)) goto finish;
break;
@ -298,7 +298,7 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
// Set trigger repetition duration and interval.
if (ttData.MinutesDuration || ttData.MinutesInterval) {
CComPtr<IRepetitionPattern> pRepetitionPattern;
winstd::com_obj<IRepetitionPattern> pRepetitionPattern;
hr = pTrigger->get_Repetition(&pRepetitionPattern);
if (FAILED(hr)) goto finish;
@ -332,17 +332,17 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
pTaskDefinition, // pDefinition
TASK_CREATE, // flags
vEmpty, // userId
logonType != TASK_LOGON_SERVICE_ACCOUNT && !m_sPassword.empty() ? CComVariant(m_sPassword.c_str()) : vEmpty, // password
logonType != TASK_LOGON_SERVICE_ACCOUNT && !m_sPassword.empty() ? winstd::variant(m_sPassword.c_str()) : vEmpty, // password
logonType, // logonType
vEmpty, // sddl
&pTask); // ppTask
} else {
// Windows XP or older.
CComPtr<ITaskScheduler> pTaskScheduler;
CComPtr<ITask> pTask;
winstd::com_obj<ITaskScheduler> pTaskScheduler;
winstd::com_obj<ITask> pTask;
// Get task scheduler object.
hr = pTaskScheduler.CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
hr = pTaskScheduler.create(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
if (FAILED(hr)) goto finish;
// Create the new task.
@ -379,7 +379,7 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
// Add triggers.
for (auto t = m_lTriggers.cbegin(), t_end = m_lTriggers.cend(); t != t_end; ++t) {
WORD wTriggerIdx;
CComPtr<ITaskTrigger> pTrigger;
winstd::com_obj<ITaskTrigger> pTrigger;
TASK_TRIGGER ttData = *t; // Don't use reference! We don't want to modify original trigger data by adding random startup delay.
hr = pTask->CreateTrigger(&wTriggerIdx, &pTrigger);
@ -425,7 +425,7 @@ HRESULT COpTaskCreate::Execute(CSession *pSession)
}
// Save the task.
CComQIPtr<IPersistFile> pTaskFile(pTask);
winstd::com_obj<IPersistFile> pTaskFile(pTask);
if (!pTaskFile) { hr = E_NOINTERFACE; goto finish; }
hr = pTaskFile->Save(NULL, TRUE);
}
@ -616,8 +616,6 @@ UINT COpTaskCreate::SetTriggersFromView(MSIHANDLE hView)
m_lTriggers.push_back(ttData);
}
return NO_ERROR;
}
@ -634,13 +632,13 @@ COpTaskDelete::COpTaskDelete(LPCWSTR pszTaskName, int iTicks) :
HRESULT COpTaskDelete::Execute(CSession *pSession)
{
HRESULT hr;
CComPtr<ITaskService> pService;
winstd::com_obj<ITaskService> pService;
hr = pService.CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
hr = pService.create(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
if (SUCCEEDED(hr)) {
// Windows Vista or newer.
CComVariant vEmpty;
CComPtr<ITaskFolder> pTaskFolder;
winstd::variant vEmpty;
winstd::com_obj<ITaskFolder> pTaskFolder;
// Connect to local task service.
hr = pService->Connect(vEmpty, vEmpty, vEmpty, vEmpty);
@ -651,13 +649,13 @@ HRESULT COpTaskDelete::Execute(CSession *pSession)
if (FAILED(hr)) goto finish;
if (pSession->m_bRollbackEnabled) {
CComPtr<IRegisteredTask> pTask, pTaskOrig;
CComPtr<ITaskDefinition> pTaskDefinition;
CComPtr<IPrincipal> pPrincipal;
winstd::com_obj<IRegisteredTask> pTask, pTaskOrig;
winstd::com_obj<ITaskDefinition> pTaskDefinition;
winstd::com_obj<IPrincipal> pPrincipal;
VARIANT_BOOL bEnabled;
TASK_LOGON_TYPE logonType;
winstd::bstr sSSDL;
CComVariant vSSDL;
winstd::variant vSSDL;
std::wstring sDisplayNameOrig;
UINT uiCount = 0;
@ -694,7 +692,7 @@ HRESULT COpTaskDelete::Execute(CSession *pSession)
// Get task security descriptor.
hr = pTask->GetSecurityDescriptor(DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION | SACL_SECURITY_INFORMATION | LABEL_SECURITY_INFORMATION, &sSSDL);
if (hr == HRESULT_FROM_WIN32(ERROR_PRIVILEGE_NOT_HELD)) vSSDL.Clear();
if (hr == HRESULT_FROM_WIN32(ERROR_PRIVILEGE_NOT_HELD)) ::VariantClear(&vSSDL);
else if (FAILED(hr)) goto finish;
else {
V_VT (&vSSDL) = VT_BSTR;
@ -734,14 +732,14 @@ HRESULT COpTaskDelete::Execute(CSession *pSession)
}
} else {
// Windows XP or older.
CComPtr<ITaskScheduler> pTaskScheduler;
winstd::com_obj<ITaskScheduler> pTaskScheduler;
// Get task scheduler object.
hr = pTaskScheduler.CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
hr = pTaskScheduler.create(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
if (FAILED(hr)) goto finish;
if (pSession->m_bRollbackEnabled) {
CComPtr<ITask> pTask;
winstd::com_obj<ITask> pTask;
DWORD dwFlags;
std::wstring sDisplayNameOrig;
UINT uiCount = 0;
@ -776,7 +774,7 @@ HRESULT COpTaskDelete::Execute(CSession *pSession)
if (FAILED(hr)) goto finish;
// Save the backup copy.
CComQIPtr<IPersistFile> pTaskFile(pTask);
winstd::com_obj<IPersistFile> pTaskFile(pTask);
if (!pTaskFile) { hr = E_NOINTERFACE; goto finish; }
hr = pTaskFile->Save(NULL, TRUE);
if (FAILED(hr)) goto finish;
@ -823,14 +821,14 @@ COpTaskEnable::COpTaskEnable(LPCWSTR pszTaskName, BOOL bEnable, int iTicks) :
HRESULT COpTaskEnable::Execute(CSession *pSession)
{
HRESULT hr;
CComPtr<ITaskService> pService;
winstd::com_obj<ITaskService> pService;
hr = pService.CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
hr = pService.create(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
if (SUCCEEDED(hr)) {
// Windows Vista or newer.
CComVariant vEmpty;
CComPtr<ITaskFolder> pTaskFolder;
CComPtr<IRegisteredTask> pTask;
winstd::variant vEmpty;
winstd::com_obj<ITaskFolder> pTaskFolder;
winstd::com_obj<IRegisteredTask> pTask;
VARIANT_BOOL bEnabled;
// Connect to local task service.
@ -872,12 +870,12 @@ HRESULT COpTaskEnable::Execute(CSession *pSession)
if (FAILED(hr)) goto finish;
} else {
// Windows XP or older.
CComPtr<ITaskScheduler> pTaskScheduler;
CComPtr<ITask> pTask;
winstd::com_obj<ITaskScheduler> pTaskScheduler;
winstd::com_obj<ITask> pTask;
DWORD dwFlags;
// Get task scheduler object.
hr = pTaskScheduler.CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
hr = pTaskScheduler.create(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
if (FAILED(hr)) goto finish;
// Load the task.
@ -911,7 +909,7 @@ HRESULT COpTaskEnable::Execute(CSession *pSession)
if (FAILED(hr)) goto finish;
// Save the task.
CComQIPtr<IPersistFile> pTaskFile(pTask);
winstd::com_obj<IPersistFile> pTaskFile(pTask);
if (!pTaskFile) { hr = E_NOINTERFACE; goto finish; }
hr = pTaskFile->Save(NULL, TRUE);
if (FAILED(hr)) goto finish;
@ -942,16 +940,16 @@ COpTaskCopy::COpTaskCopy(LPCWSTR pszTaskSrc, LPCWSTR pszTaskDst, int iTicks) :
HRESULT COpTaskCopy::Execute(CSession *pSession)
{
HRESULT hr;
CComPtr<ITaskService> pService;
winstd::com_obj<ITaskService> pService;
hr = pService.CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
hr = pService.create(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER);
if (SUCCEEDED(hr)) {
// Windows Vista or newer.
CComVariant vEmpty;
CComPtr<ITaskFolder> pTaskFolder;
CComPtr<IRegisteredTask> pTask, pTaskOrig;
CComPtr<ITaskDefinition> pTaskDefinition;
CComPtr<IPrincipal> pPrincipal;
winstd::variant vEmpty;
winstd::com_obj<ITaskFolder> pTaskFolder;
winstd::com_obj<IRegisteredTask> pTask, pTaskOrig;
winstd::com_obj<ITaskDefinition> pTaskDefinition;
winstd::com_obj<IPrincipal> pPrincipal;
TASK_LOGON_TYPE logonType;
winstd::bstr sSSDL;
@ -991,16 +989,16 @@ HRESULT COpTaskCopy::Execute(CSession *pSession)
vEmpty, // userId
vEmpty, // password
logonType, // logonType
CComVariant(sSSDL), // sddl
winstd::variant(sSSDL), // sddl
&pTaskOrig); // ppTask
if (FAILED(hr)) goto finish;
} else {
// Windows XP or older.
CComPtr<ITaskScheduler> pTaskScheduler;
CComPtr<ITask> pTask;
winstd::com_obj<ITaskScheduler> pTaskScheduler;
winstd::com_obj<ITask> pTask;
// Get task scheduler object.
hr = pTaskScheduler.CoCreateInstance(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
hr = pTaskScheduler.create(CLSID_CTaskScheduler, NULL, CLSCTX_ALL);
if (FAILED(hr)) goto finish;
// Load the source task.
@ -1016,7 +1014,7 @@ HRESULT COpTaskCopy::Execute(CSession *pSession)
if (FAILED(hr)) goto finish;
// Save the task.
CComQIPtr<IPersistFile> pTaskFile(pTask);
winstd::com_obj<IPersistFile> pTaskFile(pTask);
if (!pTaskFile) { hr = E_NOINTERFACE; goto finish; }
hr = pTaskFile->Save(NULL, TRUE);
if (FAILED(hr)) goto finish;

View File

@ -81,7 +81,7 @@ HRESULT COpWLANProfileDelete::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 3, m_sValue.c_str() );
::MsiRecordSetInteger(hRecordProg, 4, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
} else {
PMSIHANDLE hRecordProg = ::MsiCreateRecord(1);
@ -148,7 +148,7 @@ HRESULT COpWLANProfileSet::Execute(CSession *pSession)
::MsiRecordSetStringW(hRecordProg, 4, sReason.c_str() );
::MsiRecordSetInteger(hRecordProg, 5, dwError );
::MsiProcessMessage(pSession->m_hInstall, INSTALLMESSAGE_ERROR, hRecordProg);
return AtlHresultFromWin32(dwError);
return HRESULT_FROM_WIN32(dwError);
}
} else {
PMSIHANDLE hRecordProg = ::MsiCreateRecord(1);

View File

@ -24,16 +24,10 @@
#include <WinStd/COM.h>
#include <WinStd/Crypt.h>
#include <atlex/atlcrypt.h>
#include <atlex/atlwin.h>
#include <atlbase.h>
#include <atlfile.h>
#include <atlstr.h>
#include <msi.h>
#include <msiquery.h>
#include <mstask.h>
#include <shlwapi.h>
#include <taskschd.h>
#include <wlanapi.h>