MSICA/MSICALib/MSITSCA.cpp
2012-12-17 14:33:42 +00:00

161 lines
4.7 KiB
C++

#include "StdAfx.h"
#pragma comment(lib, "msi.lib")
////////////////////////////////////////////////////////////////////////////
// Globalne spremenljivke
////////////////////////////////////////////////////////////////////////////
HINSTANCE MSITSCA::hInstance = NULL;
////////////////////////////////////////////////////////////////////////////
// Globalne funkcije
////////////////////////////////////////////////////////////////////////////
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
switch (dwReason) {
case DLL_PROCESS_ATTACH:
MSITSCA::hInstance = hInstance;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////
// Javne funkcije
////////////////////////////////////////////////////////////////////
UINT MSITSCA_API EvaluateScheduledTasks(MSIHANDLE hInstall)
{
UNREFERENCED_PARAMETER(hInstall);
UINT uiResult;
BOOL bIsCoInitialized = SUCCEEDED(::CoInitialize(NULL));
CString sSequenceFilename, sComponent;
CStringW sDisplayName;
CFile fSequence;
PMSIHANDLE hDatabase, hViewST;
assert(0); // Attach debugger here or press "Ignore"!
{
// Prepare our own "TODO" script.
LPTSTR szBuffer = sSequenceFilename.GetBuffer(MAX_PATH);
assert(szBuffer);
::GetTempPath(MAX_PATH, szBuffer);
::GetTempFileName(szBuffer, _T("TS"), 0, szBuffer);
sSequenceFilename.ReleaseBuffer();
}
if (!fSequence.Open(sSequenceFilename, CFile::modeWrite | CFile::shareDenyWrite | CFile::modeCreate | CFile::osSequentialScan)) {
uiResult = ERROR_CREATE_FAILED;
goto error1;
}
hDatabase = ::MsiGetActiveDatabase(hInstall);
if (!hDatabase) {
uiResult = ERROR_INVALID_HANDLE;
goto error2;
}
uiResult = ::MsiDatabaseOpenView(hDatabase, _T("SELECT Component_, DisplayName FROM ScheduledTask"), &hViewST);
if (uiResult != ERROR_SUCCESS) goto error2;
uiResult = ::MsiViewExecute(hViewST, NULL);
if (uiResult != ERROR_SUCCESS) goto error2;
for (;;) {
PMSIHANDLE hRecord;
INSTALLSTATE iInstalled, iAction;
// Fetch one record from the view.
uiResult = ::MsiViewFetch(hViewST, &hRecord);
if (uiResult == ERROR_NO_MORE_ITEMS)
break;
else if (uiResult != ERROR_SUCCESS)
goto error2;
// Read Component ID.
uiResult = ::MsiRecordGetString(hRecord, 1, sComponent);
if (uiResult != ERROR_SUCCESS) goto error2;
// Get component state and save for deferred processing.
uiResult = ::MsiGetComponentState(hInstall, sComponent, &iInstalled, &iAction);
if (uiResult != ERROR_SUCCESS) goto error2;
fSequence << iAction;
// Get task's display name and save for deferred processing.
uiResult = ::MsiRecordGetStringW(hRecord, 2, sDisplayName);
if (uiResult != ERROR_SUCCESS) goto error2;
fSequence << sDisplayName;
}
verify(::MsiViewClose(hViewST) == ERROR_SUCCESS);
uiResult = ERROR_SUCCESS;
error2:
fSequence.Close();
error1:
if (uiResult != ERROR_SUCCESS) ::DeleteFile(sSequenceFilename);
if (bIsCoInitialized) ::CoUninitialize();
return uiResult;
}
UINT MSITSCA_API InstallScheduledTasks(MSIHANDLE hInstall)
{
UNREFERENCED_PARAMETER(hInstall);
assert(::MsiGetMode(hInstall, MSIRUNMODE_SCHEDULED));
UINT uiResult;
BOOL bIsCoInitialized = SUCCEEDED(::CoInitialize(NULL));
assert(0); // Attach debugger here or press "Ignore"!
uiResult = ERROR_SUCCESS;
if (bIsCoInitialized) ::CoUninitialize();
return uiResult;
}
UINT MSITSCA_API CommitScheduledTasks(MSIHANDLE hInstall)
{
UNREFERENCED_PARAMETER(hInstall);
assert(::MsiGetMode(hInstall, MSIRUNMODE_COMMIT));
UINT uiResult;
BOOL bIsCoInitialized = SUCCEEDED(::CoInitialize(NULL));
assert(0); // Attach debugger here or press "Ignore"!
uiResult = ERROR_SUCCESS;
if (bIsCoInitialized) ::CoUninitialize();
return uiResult;
}
UINT MSITSCA_API RollbackScheduledTasks(MSIHANDLE hInstall)
{
UNREFERENCED_PARAMETER(hInstall);
assert(::MsiGetMode(hInstall, MSIRUNMODE_ROLLBACK));
UINT uiResult;
BOOL bIsCoInitialized = SUCCEEDED(::CoInitialize(NULL));
assert(0); // Attach debugger here or press "Ignore"!
uiResult = ERROR_SUCCESS;
if (bIsCoInitialized) ::CoUninitialize();
return uiResult;
}