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:
parent
a8b69efe02
commit
64296e1d3b
@ -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>
|
||||
|
@ -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
@ -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.
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
146
src/OpTS.cpp
146
src/OpTS.cpp
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user