From 64296e1d3b91b9af75749cc7c972395f447dfe05 Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Mon, 24 Apr 2017 21:46:00 +0200 Subject: [PATCH] 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 --- build/MSICALib.props | 2 +- build/MSICALib.vcxproj | 4 - include/MSICALib.h | 907 ++++++++++++++++++----------------------- src/MSICALib.cpp | 97 ++--- src/OpCert.cpp | 8 +- src/OpFile.cpp | 4 +- src/OpReg.cpp | 16 +- src/OpSvc.cpp | 6 +- src/OpTS.cpp | 146 ++++--- src/OpWLAN.cpp | 4 +- src/stdafx.h | 8 +- 11 files changed, 532 insertions(+), 670 deletions(-) diff --git a/build/MSICALib.props b/build/MSICALib.props index b7cad0a..51dd834 100644 --- a/build/MSICALib.props +++ b/build/MSICALib.props @@ -36,7 +36,7 @@ - ..\include;..\..\WinStd\include;..\..\atlex\include;%(AdditionalIncludeDirectories) + ..\include;..\..\WinStd\include;%(AdditionalIncludeDirectories) Use stdafx.h diff --git a/build/MSICALib.vcxproj b/build/MSICALib.vcxproj index 564b668..c772b97 100644 --- a/build/MSICALib.vcxproj +++ b/build/MSICALib.vcxproj @@ -28,22 +28,18 @@ StaticLibrary Unicode - Static StaticLibrary Unicode - Static StaticLibrary Unicode - Static StaticLibrary Unicode - Static diff --git a/include/MSICALib.h b/include/MSICALib.h index 0dd4a1a..d1f61e8 100644 --- a/include/MSICALib.h +++ b/include/MSICALib.h @@ -19,11 +19,12 @@ #pragma once -#include -#include #include +#include + #include #include + #include #include #include @@ -77,6 +78,15 @@ namespace MSICA { class CSession; +//////////////////////////////////////////////////////////////////////////// +// CStream +//////////////////////////////////////////////////////////////////////////// + +class CStream : public winstd::file +{ +}; + + //////////////////////////////////////////////////////////////////////////// // COperation //////////////////////////////////////////////////////////////////////////// @@ -89,8 +99,8 @@ public: virtual HRESULT Execute(CSession *pSession) = 0; friend class COpList; - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COperation &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COperation &op); + friend inline BOOL operator <<(CStream &f, const COperation &op); + friend inline BOOL operator >>(CStream &f, COperation &op); protected: int m_iTicks; // Number of ticks on a progress bar required for this action execution @@ -106,8 +116,8 @@ class COpTypeSingleString : public COperation public: COpTypeSingleString(LPCWSTR pszValue = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpTypeSingleString &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpTypeSingleString &op); + friend inline BOOL operator <<(CStream &f, const COpTypeSingleString &op); + friend inline BOOL operator >>(CStream &f, COpTypeSingleString &op); protected: std::wstring m_sValue; @@ -123,8 +133,8 @@ class COpTypeSrcDstString : public COperation public: COpTypeSrcDstString(LPCWSTR pszValue1 = L"", LPCWSTR pszValue2 = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpTypeSrcDstString &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpTypeSrcDstString &op); + friend inline BOOL operator <<(CStream &f, const COpTypeSrcDstString &op); + friend inline BOOL operator >>(CStream &f, COpTypeSrcDstString &op); protected: std::wstring m_sValue1; @@ -141,8 +151,8 @@ class COpTypeBoolean : public COperation public: COpTypeBoolean(BOOL bValue = TRUE, int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpTypeBoolean &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpTypeBoolean &op); + friend inline BOOL operator <<(CStream &f, const COpTypeBoolean &op); + friend inline BOOL operator >>(CStream &f, COpTypeBoolean &op); protected: BOOL m_bValue; @@ -194,8 +204,8 @@ class COpRegKeySingle : public COpTypeSingleString public: COpRegKeySingle(HKEY hKeyRoot = NULL, LPCWSTR pszKeyName = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegKeySingle &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpRegKeySingle &op); + friend inline BOOL operator <<(CStream &f, const COpRegKeySingle &op); + friend inline BOOL operator >>(CStream &f, COpRegKeySingle &op); protected: HKEY m_hKeyRoot; @@ -211,8 +221,8 @@ class COpRegKeySrcDst : public COpTypeSrcDstString public: COpRegKeySrcDst(HKEY hKeyRoot = NULL, LPCWSTR pszKeyNameSrc = L"", LPCWSTR pszKeyNameDst = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegKeySrcDst &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpRegKeySrcDst &op); + friend inline BOOL operator <<(CStream &f, const COpRegKeySrcDst &op); + friend inline BOOL operator >>(CStream &f, COpRegKeySrcDst &op); protected: HKEY m_hKeyRoot; @@ -271,8 +281,8 @@ class COpRegValueSingle : public COpRegKeySingle public: COpRegValueSingle(HKEY hKeyRoot = NULL, LPCWSTR pszKeyName = L"", LPCWSTR pszValueName = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegValueSingle &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpRegValueSingle &op); + friend inline BOOL operator <<(CStream &f, const COpRegValueSingle &op); + friend inline BOOL operator >>(CStream &f, COpRegValueSingle &op); protected: std::wstring m_sValueName; @@ -288,8 +298,8 @@ class COpRegValueSrcDst : public COpRegKeySingle public: COpRegValueSrcDst(HKEY hKeyRoot = NULL, LPCWSTR pszKeyName = L"", LPCWSTR pszValueNameSrc = L"", LPCWSTR pszValueNameDst = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegValueSrcDst &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpRegValueSrcDst &op); + friend inline BOOL operator <<(CStream &f, const COpRegValueSrcDst &op); + friend inline BOOL operator >>(CStream &f, COpRegValueSrcDst &op); protected: std::wstring m_sValueName1; @@ -311,8 +321,8 @@ public: COpRegValueCreate(HKEY hKeyRoot, LPCWSTR pszKeyName, LPCWSTR pszValueName, DWORDLONG qwData, int iTicks = 0); virtual HRESULT Execute(CSession *pSession); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegValueCreate &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpRegValueCreate &op); + friend inline BOOL operator <<(CStream &f, const COpRegValueCreate &op); + friend inline BOOL operator >>(CStream &f, COpRegValueCreate &op); protected: DWORD m_dwType; @@ -361,8 +371,8 @@ public: UINT SetFromRecord(MSIHANDLE hInstall, MSIHANDLE hRecord); UINT SetTriggersFromView(MSIHANDLE hView); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpTaskCreate &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpTaskCreate &op); + friend inline BOOL operator <<(CStream &f, const COpTaskCreate &op); + friend inline BOOL operator >>(CStream &f, COpTaskCreate &op); protected: std::wstring m_sApplicationName; @@ -404,8 +414,8 @@ public: COpTaskEnable(LPCWSTR pszTaskName = L"", BOOL bEnable = TRUE, int iTicks = 0); virtual HRESULT Execute(CSession *pSession); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpTaskEnable &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpTaskEnable &op); + friend inline BOOL operator <<(CStream &f, const COpTaskEnable &op); + friend inline BOOL operator >>(CStream &f, COpTaskEnable &op); protected: BOOL m_bEnable; @@ -433,8 +443,8 @@ class COpCertStore : public COpTypeSingleString public: COpCertStore(LPCWSTR pszStore = L"", DWORD dwEncodingType = 0, DWORD dwFlags = 0, int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpCertStore &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpCertStore &op); + friend inline BOOL operator <<(CStream &f, const COpCertStore &op); + friend inline BOOL operator >>(CStream &f, COpCertStore &op); protected: DWORD m_dwEncodingType; @@ -451,8 +461,8 @@ class COpCert : public COpCertStore public: COpCert(LPCVOID lpCert = NULL, SIZE_T nSize = 0, LPCWSTR pszStore = L"", DWORD dwEncodingType = 0, DWORD dwFlags = 0, int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpCert &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpCert &op); + friend inline BOOL operator <<(CStream &f, const COpCert &op); + friend inline BOOL operator >>(CStream &f, COpCert &op); protected: std::vector m_binCert; @@ -493,8 +503,8 @@ public: COpSvcSetStart(LPCWSTR pszService = L"", DWORD dwStartType = SERVICE_DEMAND_START, int iTicks = 0); virtual HRESULT Execute(CSession *pSession); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpSvcSetStart &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpSvcSetStart &op); + friend inline BOOL operator <<(CStream &f, const COpSvcSetStart &op); + friend inline BOOL operator >>(CStream &f, COpSvcSetStart &op); protected: DWORD m_dwStartType; @@ -512,8 +522,8 @@ public: static DWORD WaitForState(CSession *pSession, SC_HANDLE hService, DWORD dwPendingState, DWORD dwFinalState); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpSvcControl &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpSvcControl &op); + friend inline BOOL operator <<(CStream &f, const COpSvcControl &op); + friend inline BOOL operator >>(CStream &f, COpSvcControl &op); protected: BOOL m_bWait; @@ -553,8 +563,8 @@ class COpWLANProfile : public COpTypeSingleString public: COpWLANProfile(const GUID &guidInterface = GUID_NULL, LPCWSTR pszProfileName = L"", int iTicks = 0); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfile &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfile &op); + friend inline BOOL operator <<(CStream &f, const COpWLANProfile &op); + friend inline BOOL operator >>(CStream &f, COpWLANProfile &op); protected: GUID m_guidInterface; @@ -583,8 +593,8 @@ public: COpWLANProfileSet(const GUID &guidInterface = GUID_NULL, DWORD dwFlags = 0, LPCWSTR pszProfileName = L"", LPCWSTR pszProfileXML = L"", int iTicks = 0); virtual HRESULT Execute(CSession *pSession); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfileSet &op); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfileSet &op); + friend inline BOOL operator <<(CStream &f, const COpWLANProfileSet &op); + friend inline BOOL operator >>(CStream &f, COpWLANProfileSet &op); protected: DWORD m_dwFlags; @@ -596,19 +606,20 @@ protected: // COpList //////////////////////////////////////////////////////////////////////////// -class COpList : public COperation, public std::list +class COpList : public COperation, public std::list > { public: COpList(int iTicks = 0); - void Free(); - HRESULT LoadFromFile(LPCTSTR pszFileName); - HRESULT SaveToFile(LPCTSTR pszFileName) const; + inline void push_front(COperation *pOp); + inline void push_back(COperation *pOp); + DWORD LoadFromFile(LPCTSTR pszFileName); + DWORD SaveToFile(LPCTSTR pszFileName) const; virtual HRESULT Execute(CSession *pSession); - friend inline HRESULT operator <<(ATL::CAtlFile &f, const COpList &list); - friend inline HRESULT operator >>(ATL::CAtlFile &f, COpList &list); + friend inline BOOL operator <<(CStream &f, const COpList &list); + friend inline BOOL operator >>(CStream &f, COpList &list); protected: enum OPERATION { @@ -636,8 +647,8 @@ protected: }; protected: - template inline static HRESULT Save(ATL::CAtlFile &f, const COperation *p); - template inline HRESULT load_back(ATL::CAtlFile &f); + template inline static BOOL write(CStream &f, const COperation *p); + template inline BOOL read_back(CStream &f); }; @@ -649,7 +660,6 @@ class CSession { public: CSession(); - virtual ~CSession(); MSIHANDLE m_hInstall; // Installer handle BOOL m_bContinueOnError; // Continue execution on operation error? @@ -673,16 +683,14 @@ UINT ExecuteSequence(MSIHANDLE hInstall); // Local includes //////////////////////////////////////////////////////////////////// -#include "../../../lib/atlex/include/atlex/atlmsi.h" -#include -#include -#include -#include - #include #include +#include +#include +#include + //////////////////////////////////////////////////////////////////// // Inline helper functions @@ -752,692 +760,573 @@ namespace MSICA { // Inline operators //////////////////////////////////////////////////////////////////////////// -inline HRESULT operator <<(ATL::CAtlFile &f, int i) +template +inline BOOL operator <<(CStream &f, const T &val) { - HRESULT hr; DWORD dwWritten; - hr = f.Write(&i, sizeof(int), &dwWritten); - return SUCCEEDED(hr) ? dwWritten == sizeof(int) ? hr : E_FAIL : hr; + if (!::WriteFile(f, &val, sizeof(T), &dwWritten, NULL)) return FALSE; + if (dwWritten != sizeof(T)) { + ::SetLastError(ERROR_WRITE_FAULT); + return FALSE; + } + + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, int &i) +template +inline BOOL operator >>(CStream &f, T &val) { - HRESULT hr; DWORD dwRead; - hr = f.Read(&i, sizeof(int), dwRead); - return SUCCEEDED(hr) ? dwRead == sizeof(int) ? hr : E_FAIL : hr; -} + if (!::ReadFile(f, &val, sizeof(T), &dwRead, NULL)) return FALSE; + if (dwRead != sizeof(T)) { + ::SetLastError(ERROR_READ_FAULT); + return FALSE; + } - -inline HRESULT operator <<(ATL::CAtlFile &f, DWORDLONG i) -{ - HRESULT hr; - DWORD dwWritten; - - hr = f.Write(&i, sizeof(DWORDLONG), &dwWritten); - return SUCCEEDED(hr) ? dwWritten == sizeof(DWORDLONG) ? hr : E_FAIL : hr; -} - - -inline HRESULT operator >>(ATL::CAtlFile &f, DWORDLONG &i) -{ - HRESULT hr; - DWORD dwRead; - - hr = f.Read(&i, sizeof(DWORDLONG), dwRead); - return SUCCEEDED(hr) ? dwRead == sizeof(DWORDLONG) ? hr : E_FAIL : hr; -} - - -inline HRESULT operator <<(ATL::CAtlFile &f, const GUID &guid) -{ - HRESULT hr; - DWORD dwWritten; - - hr = f.Write(&guid, sizeof(GUID), &dwWritten); - return SUCCEEDED(hr) ? dwWritten == sizeof(GUID) ? hr : E_FAIL : hr; -} - - -inline HRESULT operator >>(ATL::CAtlFile &f, GUID &guid) -{ - HRESULT hr; - DWORD dwRead; - - hr = f.Read(&guid, sizeof(GUID), dwRead); - return SUCCEEDED(hr) ? dwRead == sizeof(GUID) ? hr : E_FAIL : hr; + return TRUE; } template -inline HRESULT operator <<(ATL::CAtlFile &f, const std::vector<_Ty, _Ax> &a) +inline BOOL operator <<(CStream &f, const std::vector<_Ty, _Ax> &val) { - HRESULT hr; - size_t nCount = a.size(); - DWORD dwWritten; - // Write element count. - hr = f.Write(&nCount, sizeof(size_t), &dwWritten); - if (FAILED(hr)) return hr; - if (dwWritten < sizeof(size_t)) return E_FAIL; + size_t nCount = val.size(); + if (!(f << nCount)) return FALSE; // Write data (opaque). - hr = f.Write(a.data(), static_cast(sizeof(_Ty) * nCount), &dwWritten); - return SUCCEEDED(hr) ? dwWritten == sizeof(_Ty) * nCount ? hr : E_FAIL : hr; + DWORD dwWritten; + if (!::WriteFile(f, val.data(), static_cast(sizeof(_Ty) * nCount), &dwWritten, NULL)) return FALSE; + if (dwWritten != sizeof(_Ty) * nCount) { + ::SetLastError(ERROR_WRITE_FAULT); + return FALSE; + } + + return TRUE; } template -inline HRESULT operator >>(ATL::CAtlFile &f, std::vector<_Ty, _Ax> &a) +inline BOOL operator >>(CStream &f, std::vector<_Ty, _Ax> &val) { - HRESULT hr; - size_t nCount; - DWORD dwRead; - // Read element count. - hr = f.Read(&nCount, sizeof(size_t), dwRead); - if (FAILED(hr)) return hr; - if (dwRead < sizeof(size_t)) return E_FAIL; + size_t nCount; + if (!(f >> nCount)) return FALSE; // Allocate the buffer. - a.resize(nCount); + val.resize(nCount); // Read data (opaque). - hr = f.Read(a.data(), static_cast(sizeof(_Ty) * nCount), dwRead); - if (SUCCEEDED(hr)) a.resize(dwRead / sizeof(_Ty)); - return hr; + DWORD dwRead; + if (!::ReadFile(f, val.data(), static_cast(sizeof(_Ty) * nCount), &dwRead, NULL)) return FALSE; + if (dwRead != sizeof(_Ty) * nCount) { + ::SetLastError(ERROR_READ_FAULT); + return FALSE; + } + + return TRUE; } template -inline HRESULT operator <<(ATL::CAtlFile &f, const std::basic_string<_Elem, _Traits, _Ax> &str) +inline BOOL operator <<(CStream &f, const std::basic_string<_Elem, _Traits, _Ax> &val) { - HRESULT hr; - size_t iLength = str.length(); - DWORD dwWritten; - // Write string length (in characters). - hr = f.Write(&iLength, sizeof(size_t), &dwWritten); - if (FAILED(hr)) return hr; - if (dwWritten < sizeof(size_t)) return E_FAIL; + size_t iLength = val.length(); + if (!(f << iLength)) return FALSE; // Write string data (without terminator). - hr = f.Write(str.c_str(), static_cast(sizeof(_Elem) * iLength), &dwWritten); - return SUCCEEDED(hr) ? dwWritten == sizeof(_Elem) * iLength ? hr : E_FAIL : hr; + DWORD dwWritten; + if (!::WriteFile(f, val.c_str(), static_cast(sizeof(_Elem) * iLength), &dwWritten, NULL)) return FALSE; + if (dwWritten != sizeof(_Elem) * iLength) { + ::SetLastError(ERROR_WRITE_FAULT); + return FALSE; + } + + return TRUE; } template -inline HRESULT operator >>(ATL::CAtlFile &f, std::basic_string<_Elem, _Traits, _Ax> &str) +inline BOOL operator >>(CStream &f, std::basic_string<_Elem, _Traits, _Ax> &val) { - HRESULT hr; - size_t iLength; - DWORD dwRead; - // Read string length (in characters). - hr = f.Read(&iLength, sizeof(size_t), dwRead); - if (FAILED(hr)) return hr; - if (dwRead < sizeof(size_t)) return E_FAIL; + size_t iLength; + if (!(f >> iLength)) return FALSE; // Allocate the buffer. std::unique_ptr<_Elem[]> buf(new _Elem[iLength]); - if (!buf) return E_OUTOFMEMORY; + if (!buf) { + ::SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } // Read string data (without terminator). - hr = f.Read(buf.get(), static_cast(sizeof(_Elem) * iLength), dwRead); - str.assign(buf.get(), SUCCEEDED(hr) ? dwRead / sizeof(_Elem) : 0); - return hr; -} - - -inline HRESULT operator <<(ATL::CAtlFile &f, const TASK_TRIGGER &ttData) -{ - HRESULT hr; - DWORD dwWritten; - - hr = f.Write(&ttData, sizeof(TASK_TRIGGER), &dwWritten); - return SUCCEEDED(hr) ? dwWritten == sizeof(TASK_TRIGGER) ? hr : E_FAIL : hr; -} - - -inline HRESULT operator >>(ATL::CAtlFile &f, TASK_TRIGGER &ttData) -{ - HRESULT hr; DWORD dwRead; + if (!::ReadFile(f, buf.get(), static_cast(sizeof(_Elem) * iLength), &dwRead, NULL)) return FALSE; + if (dwRead != sizeof(_Elem) * iLength) { + ::SetLastError(ERROR_READ_FAULT); + return FALSE; + } + val.assign(buf.get(), iLength); - hr = f.Read(&ttData, sizeof(TASK_TRIGGER), dwRead); - return SUCCEEDED(hr) ? dwRead == sizeof(TASK_TRIGGER) ? hr : E_FAIL : hr; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COperation &op) +inline BOOL operator <<(CStream &f, const COperation &op) { return f << op.m_iTicks; } -inline HRESULT operator >>(ATL::CAtlFile &f, COperation &op) +inline BOOL operator >>(CStream &f, COperation &op) { return f >> op.m_iTicks; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpTypeSingleString &op) +inline BOOL operator <<(CStream &f, const COpTypeSingleString &op) { - HRESULT hr; + if (!(f << (const COperation &)op)) return FALSE; + if (!(f << op.m_sValue )) return FALSE; - hr = f << (const COperation &)op; if (FAILED(hr)) return hr; - hr = f << op.m_sValue; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpTypeSingleString &op) +inline BOOL operator >>(CStream &f, COpTypeSingleString &op) { - HRESULT hr; + if (!(f >> (COperation &)op)) return FALSE; + if (!(f >> op.m_sValue )) return FALSE; - hr = f >> (COperation &)op; if (FAILED(hr)) return hr; - hr = f >> op.m_sValue; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpTypeSrcDstString &op) +inline BOOL operator <<(CStream &f, const COpTypeSrcDstString &op) { - HRESULT hr; + if (!(f << (const COperation &)op)) return FALSE; + if (!(f << op.m_sValue1 )) return FALSE; + if (!(f << op.m_sValue2 )) return FALSE; - hr = f << (const COperation &)op; if (FAILED(hr)) return hr; - hr = f << op.m_sValue1; if (FAILED(hr)) return hr; - hr = f << op.m_sValue2; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpTypeSrcDstString &op) +inline BOOL operator >>(CStream &f, COpTypeSrcDstString &op) { - HRESULT hr; + if (!(f >> (COperation &)op)) return FALSE; + if (!(f >> op.m_sValue1 )) return FALSE; + if (!(f >> op.m_sValue2 )) return FALSE; - hr = f >> (COperation &)op; if (FAILED(hr)) return hr; - hr = f >> op.m_sValue1; if (FAILED(hr)) return hr; - hr = f >> op.m_sValue2; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpTypeBoolean &op) +inline BOOL operator <<(CStream &f, const COpTypeBoolean &op) { - HRESULT hr; + if (!(f << (const COperation &)op)) return FALSE; + if (!(f << op.m_bValue )) return FALSE; - hr = f << (const COperation &)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_bValue); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpTypeBoolean &op) +inline BOOL operator >>(CStream &f, COpTypeBoolean &op) { - HRESULT hr; - int iValue; + if (!(f >> (COperation &)op)) return FALSE; + if (!(f >> op.m_bValue )) return FALSE; - hr = f >> (COperation &)op; if (FAILED(hr)) return hr; - hr = f >> iValue; if (FAILED(hr)) return hr; op.m_bValue = iValue ? TRUE : FALSE; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegKeySingle &op) +inline BOOL operator <<(CStream &f, const COpRegKeySingle &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString &)op)) return FALSE; + if (!(f << op.m_hKeyRoot )) return FALSE; - hr = f << (const COpTypeSingleString &)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_hKeyRoot); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpRegKeySingle &op) +inline BOOL operator >>(CStream &f, COpRegKeySingle &op) { - HRESULT hr; - int iValue; + if (!(f >> (COpTypeSingleString &)op)) return FALSE; + if (!(f >> op.m_hKeyRoot )) return FALSE; - hr = f >> (COpTypeSingleString &)op; if (FAILED(hr)) return hr; - hr = f >> iValue; if (FAILED(hr)) return hr; op.m_hKeyRoot = (HKEY)iValue; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegKeySrcDst &op) +inline BOOL operator <<(CStream &f, const COpRegKeySrcDst &op) { - HRESULT hr; + if (!(f << (const COpTypeSrcDstString &)op)) return FALSE; + if (!(f << op.m_hKeyRoot )) return FALSE; - hr = f << (const COpTypeSrcDstString &)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_hKeyRoot); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpRegKeySrcDst &op) +inline BOOL operator >>(CStream &f, COpRegKeySrcDst &op) { - HRESULT hr; - int iValue; + if (!(f >> (COpTypeSrcDstString &)op)) return FALSE; + if (!(f >> op.m_hKeyRoot )) return FALSE; - hr = f >> (COpTypeSrcDstString &)op; if (FAILED(hr)) return hr; - hr = f >> iValue; if (FAILED(hr)) return hr; op.m_hKeyRoot = (HKEY)iValue; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegValueSingle &op) +inline BOOL operator <<(CStream &f, const COpRegValueSingle &op) { - HRESULT hr; + if (!(f << (const COpRegKeySingle &)op)) return FALSE; + if (!(f << op.m_sValueName )) return FALSE; - hr = f << (const COpRegKeySingle &)op; if (FAILED(hr)) return hr; - hr = f << op.m_sValueName; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpRegValueSingle &op) +inline BOOL operator >>(CStream &f, COpRegValueSingle &op) { - HRESULT hr; + if (!(f >> (COpRegKeySingle &)op)) return FALSE; + if (!(f >> op.m_sValueName )) return FALSE; - hr = f >> (COpRegKeySingle &)op; if (FAILED(hr)) return hr; - hr = f >> op.m_sValueName; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegValueSrcDst &op) +inline BOOL operator <<(CStream &f, const COpRegValueSrcDst &op) { - HRESULT hr; + if (!(f << (const COpRegKeySingle &)op)) return FALSE; + if (!(f << op.m_sValueName1 )) return FALSE; + if (!(f << op.m_sValueName2 )) return FALSE; - hr = f << (const COpRegKeySingle &)op; if (FAILED(hr)) return hr; - hr = f << op.m_sValueName1; if (FAILED(hr)) return hr; - hr = f << op.m_sValueName2; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpRegValueSrcDst &op) +inline BOOL operator >>(CStream &f, COpRegValueSrcDst &op) { - HRESULT hr; + if (!(f >> (COpRegKeySingle &)op)) return FALSE; + if (!(f >> op.m_sValueName1 )) return FALSE; + if (!(f >> op.m_sValueName2 )) return FALSE; - hr = f >> (COpRegKeySingle &)op; if (FAILED(hr)) return hr; - hr = f >> op.m_sValueName1; if (FAILED(hr)) return hr; - hr = f >> op.m_sValueName2; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpRegValueCreate &op) +inline BOOL operator <<(CStream &f, const COpRegValueCreate &op) { - HRESULT hr; - - hr = f << (const COpRegValueSingle &)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwType); if (FAILED(hr)) return hr; + if (!(f << (const COpRegValueSingle &)op)) return FALSE; + if (!(f << op.m_dwType )) return FALSE; switch (op.m_dwType) { case REG_SZ: case REG_EXPAND_SZ: - case REG_LINK: hr = f << op.m_sData; if (FAILED(hr)) return hr; break; - case REG_BINARY: hr = f << op.m_binData; if (FAILED(hr)) return hr; break; + case REG_LINK: if (!(f << op.m_sData )) return FALSE; break; + case REG_BINARY: if (!(f << op.m_binData)) return FALSE; break; case REG_DWORD_LITTLE_ENDIAN: - case REG_DWORD_BIG_ENDIAN: hr = f << (int)(op.m_dwData); if (FAILED(hr)) return hr; break; - case REG_MULTI_SZ: hr = f << op.m_szData; if (FAILED(hr)) return hr; break; - case REG_QWORD_LITTLE_ENDIAN: hr = f << op.m_qwData; if (FAILED(hr)) return hr; break; - default: return E_UNEXPECTED; + case REG_DWORD_BIG_ENDIAN: if (!(f << op.m_dwData )) return FALSE; break; + case REG_MULTI_SZ: if (!(f << op.m_szData )) return FALSE; break; + case REG_QWORD_LITTLE_ENDIAN: if (!(f << op.m_qwData )) return FALSE; break; + default: ::SetLastError(ERROR_INVALID_DATA); return FALSE; } - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpRegValueCreate &op) +inline BOOL operator >>(CStream &f, COpRegValueCreate &op) { - HRESULT hr; - - hr = f >> (COpRegValueSingle &)op; if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwType); if (FAILED(hr)) return hr; + if (!(f >> (COpRegValueSingle &)op)) return FALSE; + if (!(f >> op.m_dwType )) return FALSE; switch (op.m_dwType) { case REG_SZ: case REG_EXPAND_SZ: - case REG_LINK: hr = f >> op.m_sData; if (FAILED(hr)) return hr; break; - case REG_BINARY: hr = f >> op.m_binData; if (FAILED(hr)) return hr; break; + case REG_LINK: if (!(f >> op.m_sData )) return FALSE; break; + case REG_BINARY: if (!(f >> op.m_binData)) return FALSE; break; case REG_DWORD_LITTLE_ENDIAN: - case REG_DWORD_BIG_ENDIAN: hr = f >> (int&)(op.m_dwData); if (FAILED(hr)) return hr; break; - case REG_MULTI_SZ: hr = f >> op.m_szData; if (FAILED(hr)) return hr; break; - case REG_QWORD_LITTLE_ENDIAN: hr = f >> op.m_qwData; if (FAILED(hr)) return hr; break; - default: return E_UNEXPECTED; + case REG_DWORD_BIG_ENDIAN: if (!(f >> op.m_dwData )) return FALSE; break; + case REG_MULTI_SZ: if (!(f >> op.m_szData )) return FALSE; break; + case REG_QWORD_LITTLE_ENDIAN: if (!(f >> op.m_qwData )) return FALSE; break; + default: ::SetLastError(ERROR_INVALID_DATA); return FALSE; } - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpTaskCreate &op) +inline BOOL operator <<(CStream &f, const COpTaskCreate &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString&)op)) return FALSE; + if (!(f << op.m_sApplicationName )) return FALSE; + if (!(f << op.m_sParameters )) return FALSE; + if (!(f << op.m_sWorkingDirectory )) return FALSE; + if (!(f << op.m_sAuthor )) return FALSE; + if (!(f << op.m_sComment )) return FALSE; + if (!(f << op.m_dwFlags )) return FALSE; + if (!(f << op.m_dwPriority )) return FALSE; + if (!(f << op.m_sAccountName )) return FALSE; + if (!(f << op.m_sPassword )) return FALSE; + if (!(f << op.m_wDeadlineMinutes )) return FALSE; + if (!(f << op.m_wIdleMinutes )) return FALSE; + if (!(f << op.m_dwMaxRuntimeMS )) return FALSE; + if (!(f << op.m_lTriggers.size() )) return FALSE; + for (auto t = op.m_lTriggers.cbegin(), t_end = op.m_lTriggers.cend(); t != t_end; ++t) + if (!(f << *t)) return FALSE; - hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f << op.m_sApplicationName; if (FAILED(hr)) return hr; - hr = f << op.m_sParameters; if (FAILED(hr)) return hr; - hr = f << op.m_sWorkingDirectory; if (FAILED(hr)) return hr; - hr = f << op.m_sAuthor; if (FAILED(hr)) return hr; - hr = f << op.m_sComment; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwFlags); if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwPriority); if (FAILED(hr)) return hr; - hr = f << op.m_sAccountName; if (FAILED(hr)) return hr; - hr = f << op.m_sPassword; if (FAILED(hr)) return hr; - hr = f << (int)MAKELONG(op.m_wDeadlineMinutes, op.m_wIdleMinutes); if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwMaxRuntimeMS); if (FAILED(hr)) return hr; - hr = f << (int)(op.m_lTriggers.size()); if (FAILED(hr)) return hr; - for (auto t = op.m_lTriggers.cbegin(), t_end = op.m_lTriggers.cend(); t != t_end; ++t) { - hr = f << *t; - if (FAILED(hr)) return hr; - } - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpTaskCreate &op) +inline BOOL operator >>(CStream &f, COpTaskCreate &op) { - HRESULT hr; - DWORD dwValue; + size_t nCount; - hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f >> op.m_sApplicationName; if (FAILED(hr)) return hr; - hr = f >> op.m_sParameters; if (FAILED(hr)) return hr; - hr = f >> op.m_sWorkingDirectory; if (FAILED(hr)) return hr; - hr = f >> op.m_sAuthor; if (FAILED(hr)) return hr; - hr = f >> op.m_sComment; if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwFlags); if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwPriority); if (FAILED(hr)) return hr; - hr = f >> op.m_sAccountName; if (FAILED(hr)) return hr; - hr = f >> op.m_sPassword; if (FAILED(hr)) return hr; - hr = f >> (int&)dwValue; if (FAILED(hr)) return hr; op.m_wIdleMinutes = HIWORD(dwValue); op.m_wDeadlineMinutes = LOWORD(dwValue); - hr = f >> (int&)(op.m_dwMaxRuntimeMS); if (FAILED(hr)) return hr; - hr = f >> (int&)dwValue; if (FAILED(hr)) return hr; - while (dwValue--) { + if (!(f >> (COpTypeSingleString&)op)) return FALSE; + if (!(f >> op.m_sApplicationName )) return FALSE; + if (!(f >> op.m_sParameters )) return FALSE; + if (!(f >> op.m_sWorkingDirectory )) return FALSE; + if (!(f >> op.m_sAuthor )) return FALSE; + if (!(f >> op.m_sComment )) return FALSE; + if (!(f >> op.m_dwFlags )) return FALSE; + if (!(f >> op.m_dwPriority )) return FALSE; + if (!(f >> op.m_sAccountName )) return FALSE; + if (!(f >> op.m_sPassword )) return FALSE; + if (!(f >> op.m_wDeadlineMinutes )) return FALSE; + if (!(f >> op.m_wIdleMinutes )) return FALSE; + if (!(f >> op.m_dwMaxRuntimeMS )) return FALSE; + if (!(f >> nCount )) return FALSE; + op.m_lTriggers.clear(); + while (nCount--) { TASK_TRIGGER ttData; - hr = f >> ttData; - if (FAILED(hr)) return hr; - op.m_lTriggers.push_back(ttData); + if (!(f >> ttData)) return FALSE; + op.m_lTriggers.push_back(std::move(ttData)); } - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpTaskEnable &op) +inline BOOL operator <<(CStream &f, const COpTaskEnable &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString&)op)) return FALSE; + if (!(f << op.m_bEnable )) return FALSE; - hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_bEnable); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpTaskEnable &op) +inline BOOL operator >>(CStream &f, COpTaskEnable &op) { - HRESULT hr; - int iTemp; + if (!(f >> (COpTypeSingleString&)op)) return FALSE; + if (!(f >> op.m_bEnable )) return FALSE; - hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f >> iTemp; if (FAILED(hr)) return hr; op.m_bEnable = iTemp ? TRUE : FALSE; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpCertStore &op) +inline BOOL operator <<(CStream &f, const COpCertStore &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString&)op)) return FALSE; + if (!(f << op.m_dwEncodingType )) return FALSE; + if (!(f << op.m_dwFlags )) return FALSE; - hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwEncodingType); if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwFlags); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpCertStore &op) +inline BOOL operator >>(CStream &f, COpCertStore &op) { - HRESULT hr; + if (!(f >> (COpTypeSingleString&)op)) return FALSE; + if (!(f >> op.m_dwEncodingType )) return FALSE; + if (!(f >> op.m_dwFlags )) return FALSE; - hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwEncodingType); if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwFlags); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpCert &op) +inline BOOL operator <<(CStream &f, const COpCert &op) { - HRESULT hr; + if (!(f << (const COpCertStore&)op)) return FALSE; + if (!(f << op.m_binCert )) return FALSE; - hr = f << (const COpCertStore&)op; if (FAILED(hr)) return hr; - hr = f << op.m_binCert; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpCert &op) +inline BOOL operator >>(CStream &f, COpCert &op) { - HRESULT hr; + if (!(f >> (COpCertStore&)op)) return FALSE; + if (!(f >> op.m_binCert )) return FALSE; - hr = f >> (COpCertStore&)op; if (FAILED(hr)) return hr; - hr = f >> op.m_binCert; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpSvcSetStart &op) +inline BOOL operator <<(CStream &f, const COpSvcSetStart &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString&)op)) return FALSE; + if (!(f << op.m_dwStartType )) return FALSE; - hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwStartType); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpSvcSetStart &op) +inline BOOL operator >>(CStream &f, COpSvcSetStart &op) { - HRESULT hr; + if (!(f >> (COpTypeSingleString&)op)) return FALSE; + if (!(f >> op.m_dwStartType )) return FALSE; - hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwStartType); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpSvcControl &op) +inline BOOL operator <<(CStream &f, const COpSvcControl &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString&)op)) return FALSE; + if (!(f << op.m_bWait )) return FALSE; - hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_bWait); if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpSvcControl &op) +inline BOOL operator >>(CStream &f, COpSvcControl &op) { - HRESULT hr; - int iValue; + if (!(f >> (COpTypeSingleString&)op)) return FALSE; + if (!(f >> op.m_bWait )) return FALSE; - hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f >> iValue; if (FAILED(hr)) return hr; op.m_bWait = iValue ? TRUE : FALSE; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfile &op) +inline BOOL operator <<(CStream &f, const COpWLANProfile &op) { - HRESULT hr; + if (!(f << (const COpTypeSingleString&)op)) return FALSE; + if (!(f << op.m_guidInterface )) return FALSE; - hr = f << (const COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f << op.m_guidInterface; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfile &op) +inline BOOL operator >>(CStream &f, COpWLANProfile &op) { - HRESULT hr; + if (!(f >> (COpTypeSingleString&)op)) return FALSE; + if (!(f >> op.m_guidInterface )) return FALSE; - hr = f >> (COpTypeSingleString&)op; if (FAILED(hr)) return hr; - hr = f >> op.m_guidInterface; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpWLANProfileSet &op) +inline BOOL operator <<(CStream &f, const COpWLANProfileSet &op) { - HRESULT hr; + if (!(f << (const COpWLANProfile&)op)) return FALSE; + if (!(f << op.m_dwFlags )) return FALSE; + if (!(f << op.m_sProfileXML )) return FALSE; - hr = f << (const COpWLANProfile&)op; if (FAILED(hr)) return hr; - hr = f << (int)(op.m_dwFlags); if (FAILED(hr)) return hr; - hr = f << op.m_sProfileXML; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpWLANProfileSet &op) +inline BOOL operator >>(CStream &f, COpWLANProfileSet &op) { - HRESULT hr; + if (!(f >> (COpWLANProfile&)op)) return FALSE; + if (!(f >> op.m_dwFlags )) return FALSE; + if (!(f >> op.m_sProfileXML )) return FALSE; - hr = f >> (COpWLANProfile&)op; if (FAILED(hr)) return hr; - hr = f >> (int&)(op.m_dwFlags); if (FAILED(hr)) return hr; - hr = f >> op.m_sProfileXML; if (FAILED(hr)) return hr; - - return S_OK; + return TRUE; } -inline HRESULT operator <<(ATL::CAtlFile &f, const COpList &list) +inline BOOL operator <<(CStream &f, const COpList &list) { - HRESULT hr; - - hr = f << (const COperation &)list; - if (FAILED(hr)) return hr; - - hr = f << (int)(list.size()); - if (FAILED(hr)) return hr; - - for (auto i = list.cbegin(), i_end = list.cend(); i != i_end; ++i) { - const COperation *pOp = *i; - if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); - else if (dynamic_cast(pOp)) hr = list.Save(f, pOp); + if (!(f << (const COperation &)list)) return FALSE; + if (!(f << list.size() )) return FALSE; + for (auto o = list.cbegin(), o_end = list.cend(); o != o_end; ++o) { + BOOL bResult; + const COperation *pOp = o->get(); + if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); + else if (dynamic_cast(pOp)) bResult = list.write(f, pOp); else { // Unsupported type of operation. - hr = E_UNEXPECTED; + ::SetLastError(ERROR_INVALID_DATA); + return FALSE; } - if (FAILED(hr)) return hr; + if (!bResult) return FALSE; } - return S_OK; + return TRUE; } -inline HRESULT operator >>(ATL::CAtlFile &f, COpList &list) +inline BOOL operator >>(CStream &f, COpList &list) { - HRESULT hr; - int iCount; + size_t nCount; - hr = f >> (COperation &)list; - if (FAILED(hr)) return hr; + if (!(f >> (COperation &)list)) return FALSE; + if (!(f >> nCount )) return FALSE; + list.clear(); + while (nCount--) { + BOOL bResult; + COpList::OPERATION opCode; - hr = f >> iCount; - if (FAILED(hr)) return hr; + if (!(f >> opCode)) return FALSE; - while (iCount--) { - int iTemp; - - hr = f >> iTemp; - if (FAILED(hr)) return hr; - - switch ((COpList::OPERATION)iTemp) { - case COpList::OP_ROLLBACK_ENABLE: hr = list.load_back(f); break; - case COpList::OP_FILE_DELETE: hr = list.load_back(f); break; - case COpList::OP_FILE_MOVE: hr = list.load_back(f); break; - case COpList::OP_REG_KEY_CREATE: hr = list.load_back(f); break; - case COpList::OP_REG_KEY_COPY: hr = list.load_back(f); break; - case COpList::OP_REG_KEY_DELETE: hr = list.load_back(f); break; - case COpList::OP_REG_VALUE_CREATE: hr = list.load_back(f); break; - case COpList::OP_REG_VALUE_COPY: hr = list.load_back(f); break; - case COpList::OP_REG_VALUE_DELETE: hr = list.load_back(f); break; - case COpList::OP_TASK_CREATE: hr = list.load_back(f); break; - case COpList::OP_TASK_DELETE: hr = list.load_back(f); break; - case COpList::OP_TASK_ENABLE: hr = list.load_back(f); break; - case COpList::OP_TASK_COPY: hr = list.load_back(f); break; - case COpList::OP_CERT_INSTALL: hr = list.load_back(f); break; - case COpList::OP_CERT_REMOVE: hr = list.load_back(f); break; - case COpList::OP_SVC_SET_START: hr = list.load_back(f); break; - case COpList::OP_SVC_START: hr = list.load_back(f); break; - case COpList::OP_SVC_STOP: hr = list.load_back(f); break; - case COpList::OP_WLAN_PROFILE_DELETE: hr = list.load_back(f); break; - case COpList::OP_WLAN_PROFILE_SET: hr = list.load_back(f); break; - case COpList::OP_SUBLIST: hr = list.load_back(f); break; + switch (opCode) { + case COpList::OP_ROLLBACK_ENABLE: bResult = list.read_back(f); break; + case COpList::OP_FILE_DELETE: bResult = list.read_back(f); break; + case COpList::OP_FILE_MOVE: bResult = list.read_back(f); break; + case COpList::OP_REG_KEY_CREATE: bResult = list.read_back(f); break; + case COpList::OP_REG_KEY_COPY: bResult = list.read_back(f); break; + case COpList::OP_REG_KEY_DELETE: bResult = list.read_back(f); break; + case COpList::OP_REG_VALUE_CREATE: bResult = list.read_back(f); break; + case COpList::OP_REG_VALUE_COPY: bResult = list.read_back(f); break; + case COpList::OP_REG_VALUE_DELETE: bResult = list.read_back(f); break; + case COpList::OP_TASK_CREATE: bResult = list.read_back(f); break; + case COpList::OP_TASK_DELETE: bResult = list.read_back(f); break; + case COpList::OP_TASK_ENABLE: bResult = list.read_back(f); break; + case COpList::OP_TASK_COPY: bResult = list.read_back(f); break; + case COpList::OP_CERT_INSTALL: bResult = list.read_back(f); break; + case COpList::OP_CERT_REMOVE: bResult = list.read_back(f); break; + case COpList::OP_SVC_SET_START: bResult = list.read_back(f); break; + case COpList::OP_SVC_START: bResult = list.read_back(f); break; + case COpList::OP_SVC_STOP: bResult = list.read_back(f); break; + case COpList::OP_WLAN_PROFILE_DELETE: bResult = list.read_back(f); break; + case COpList::OP_WLAN_PROFILE_SET: bResult = list.read_back(f); break; + case COpList::OP_SUBLIST: bResult = list.read_back(f); break; default: // Unsupported type of operation. - hr = E_UNEXPECTED; + ::SetLastError(ERROR_INVALID_DATA); + return FALSE; } - if (FAILED(hr)) return hr; + if (!bResult) return FALSE; } - return S_OK; + return TRUE; } @@ -1479,37 +1368,49 @@ inline BOOL IsWow64Process() // Inline methods //////////////////////////////////////////////////////////////////////////// -template inline static HRESULT COpList::Save(ATL::CAtlFile &f, const COperation *p) +inline void COpList::push_front(COperation *pOp) { - HRESULT hr; - const T *pp = dynamic_cast(p); - if (!pp) return E_UNEXPECTED; - - hr = f << (int)ID; - if (FAILED(hr)) return hr; - - return f << *pp; + std::list >::push_front(std::move(std::unique_ptr(pOp))); } -template inline HRESULT COpList::load_back(ATL::CAtlFile &f) +inline void COpList::push_back(COperation *pOp) { - HRESULT hr; + std::list >::push_back(std::move(std::unique_ptr(pOp))); +} - // Create element. - T *p = new T(); - if (!p) return E_OUTOFMEMORY; - // Load element from file. - hr = f >> *p; - if (FAILED(hr)) { - delete p; - return hr; +template inline static BOOL COpList::write(CStream &f, const COperation *p) +{ + const T *pp = dynamic_cast(p); + if (!pp) { + // Wrong type. + ::SetLastError(ERROR_INVALID_DATA); + return FALSE; } + if (!(f << ID )) return FALSE; + if (!(f << *pp)) return FALSE; + + return TRUE; +} + + +template inline BOOL COpList::read_back(CStream &f) +{ + // Create element. + std::unique_ptr p(new T()); + if (!p) { + ::SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + + // Load element from file. + if (!(f >> *p)) return FALSE; + // Add element. - push_back(p); - return S_OK; + std::list >::push_back(std::move(p)); + return TRUE; } } // namespace MSICA diff --git a/src/MSICALib.cpp b/src/MSICALib.cpp index d75cc6c..7b42735 100644 --- a/src/MSICALib.cpp +++ b/src/MSICALib.cpp @@ -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(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. } diff --git a/src/OpCert.cpp b/src/OpCert.cpp index 33b1759..2c45dc1 100644 --- a/src/OpCert.cpp +++ b/src/OpCert.cpp @@ -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); } } diff --git a/src/OpFile.cpp b/src/OpFile.cpp index 21cf439..5d4126f 100644 --- a/src/OpFile.cpp +++ b/src/OpFile.cpp @@ -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); } } diff --git a/src/OpReg.cpp b/src/OpReg.cpp index c6966b3..379e57a 100644 --- a/src/OpReg.cpp +++ b/src/OpReg.cpp @@ -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); } } diff --git a/src/OpSvc.cpp b/src/OpSvc.cpp index 9834784..0094d9b 100644 --- a/src/OpSvc.cpp +++ b/src/OpSvc.cpp @@ -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); } } diff --git a/src/OpTS.cpp b/src/OpTS.cpp index 69dbf46..cc8fe5e 100644 --- a/src/OpTS.cpp +++ b/src/OpTS.cpp @@ -44,12 +44,12 @@ HRESULT COpTaskCreate::Execute(CSession *pSession) { HRESULT hr; PMSIHANDLE hRecordMsg = ::MsiCreateRecord(1); - CComPtr pService; + winstd::com_obj 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 pTaskDefinition; - CComPtr pTaskSettings; - CComPtr pPrincipal; - CComPtr pActionCollection; - CComPtr pAction; - CComPtr pIdleSettings; - CComPtr pExecAction; - CComPtr pRegististrationInfo; - CComPtr pTriggerCollection; - CComPtr pTaskFolder; - CComPtr pTask; + winstd::variant vEmpty; + winstd::com_obj pTaskDefinition; + winstd::com_obj pTaskSettings; + winstd::com_obj pPrincipal; + winstd::com_obj pActionCollection; + winstd::com_obj pAction; + winstd::com_obj pIdleSettings; + winstd::com_obj pExecAction; + winstd::com_obj pRegististrationInfo; + winstd::com_obj pTriggerCollection; + winstd::com_obj pTaskFolder; + winstd::com_obj 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 pTrigger; + winstd::com_obj pTrigger; const TASK_TRIGGER &ttData = *t; switch (ttData.TriggerType) { case TASK_TIME_TRIGGER_ONCE: { - CComPtr pTriggerTime; + winstd::com_obj 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 pTriggerDaily; + winstd::com_obj 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 pTriggerWeekly; + winstd::com_obj 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 pTriggerMonthly; + winstd::com_obj 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 pTriggerMonthlyDOW; + winstd::com_obj 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 pTriggerBoot; + winstd::com_obj 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 pTriggerLogon; + winstd::com_obj 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 pRepetitionPattern; + winstd::com_obj 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 pTaskScheduler; - CComPtr pTask; + winstd::com_obj pTaskScheduler; + winstd::com_obj 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 pTrigger; + winstd::com_obj 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 pTaskFile(pTask); + winstd::com_obj 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 pService; + winstd::com_obj 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 pTaskFolder; + winstd::variant vEmpty; + winstd::com_obj 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 pTask, pTaskOrig; - CComPtr pTaskDefinition; - CComPtr pPrincipal; + winstd::com_obj pTask, pTaskOrig; + winstd::com_obj pTaskDefinition; + winstd::com_obj 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 pTaskScheduler; + winstd::com_obj 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 pTask; + winstd::com_obj 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 pTaskFile(pTask); + winstd::com_obj 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 pService; + winstd::com_obj 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 pTaskFolder; - CComPtr pTask; + winstd::variant vEmpty; + winstd::com_obj pTaskFolder; + winstd::com_obj 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 pTaskScheduler; - CComPtr pTask; + winstd::com_obj pTaskScheduler; + winstd::com_obj 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 pTaskFile(pTask); + winstd::com_obj 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 pService; + winstd::com_obj 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 pTaskFolder; - CComPtr pTask, pTaskOrig; - CComPtr pTaskDefinition; - CComPtr pPrincipal; + winstd::variant vEmpty; + winstd::com_obj pTaskFolder; + winstd::com_obj pTask, pTaskOrig; + winstd::com_obj pTaskDefinition; + winstd::com_obj 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 pTaskScheduler; - CComPtr pTask; + winstd::com_obj pTaskScheduler; + winstd::com_obj 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 pTaskFile(pTask); + winstd::com_obj pTaskFile(pTask); if (!pTaskFile) { hr = E_NOINTERFACE; goto finish; } hr = pTaskFile->Save(NULL, TRUE); if (FAILED(hr)) goto finish; diff --git a/src/OpWLAN.cpp b/src/OpWLAN.cpp index 6b37ce9..e02d0f6 100644 --- a/src/OpWLAN.cpp +++ b/src/OpWLAN.cpp @@ -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); diff --git a/src/stdafx.h b/src/stdafx.h index c946756..4c56ccb 100644 --- a/src/stdafx.h +++ b/src/stdafx.h @@ -24,16 +24,10 @@ #include #include -#include -#include - -#include -#include -#include - #include #include #include +#include #include #include