199 lines
5.2 KiB
C++
199 lines
5.2 KiB
C++
#include <windows.h>
|
|
#include "Global.h"
|
|
#include "Resource.h"
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Global variables
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
HINSTANCE g_hInstance;
|
|
DWORD g_dwOSVersion;
|
|
BOOL g_fInstallDebug;
|
|
DWORD g_dwSuccessCode;
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// This is the global structure used by this applications state machine
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
COMPONENT_INFO g_sComponentInfo[COMPONENT_COUNT] =
|
|
{
|
|
{ TEXT("AppMan.dll"), FALSE, TRUE, OS_VERSION_WIN9X, IDR_APPMAN_9X, 0, { 0 }, { 0 } },
|
|
{ TEXT("AppManD.dll"), TRUE, FALSE, OS_VERSION_WIN9X, IDR_APPMAND_9X, 0, { 0 }, { 0 } },
|
|
{ TEXT("AppManDp.dll"), FALSE, TRUE, OS_VERSION_WIN9X, IDR_APPMANDP_9X, 0, { 0 }, { 0 } },
|
|
{ TEXT("AppMan.dll"), FALSE, TRUE, OS_VERSION_WIN2K, IDR_APPMAN_2K, 0, { 0 }, { 0 } },
|
|
{ TEXT("AppManD.dll"), TRUE, FALSE, OS_VERSION_WIN2K, IDR_APPMAND_2K, 0, { 0 }, { 0 } },
|
|
{ TEXT("AppManDp.dll"), FALSE, TRUE, OS_VERSION_WIN2K, IDR_APPMANDP_2K, 0, { 0 }, { 0 } }
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL FileExists(LPCTSTR strFilename)
|
|
{
|
|
BOOL fSuccess = TRUE;
|
|
WIN32_FIND_DATA sFindFileInfo;
|
|
HANDLE hFindFileHandle;
|
|
|
|
hFindFileHandle = FindFirstFile(strFilename, &sFindFileInfo);
|
|
if (INVALID_HANDLE_VALUE == hFindFileHandle)
|
|
{
|
|
fSuccess = FALSE;
|
|
}
|
|
else
|
|
{
|
|
FindClose(hFindFileHandle);
|
|
}
|
|
|
|
return fSuccess;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD GetOSVersion(void)
|
|
{
|
|
OSVERSIONINFOEX sOSVersionInfo;
|
|
DWORD dwOSVersion = OS_VERSION_WIN32S;
|
|
|
|
//
|
|
// Try calling GetVersionEx using the OSVERSIONINFOEX structure,
|
|
// which is supported on Windows 2000.
|
|
//
|
|
// If that fails, try using the OSVERSIONINFO structure.
|
|
//
|
|
|
|
ZeroMemory(&sOSVersionInfo, sizeof(OSVERSIONINFOEX));
|
|
sOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
|
|
if(!GetVersionEx((OSVERSIONINFO *) &sOSVersionInfo))
|
|
{
|
|
//
|
|
// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
|
|
//
|
|
|
|
sOSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
|
|
if (!GetVersionEx((OSVERSIONINFO *) &sOSVersionInfo))
|
|
{
|
|
return OS_VERSION_WIN32S;
|
|
}
|
|
}
|
|
|
|
//
|
|
// What OS are we running
|
|
//
|
|
|
|
switch (sOSVersionInfo.dwPlatformId)
|
|
{
|
|
case VER_PLATFORM_WIN32_NT
|
|
: if (5 == sOSVersionInfo.dwMajorVersion)
|
|
{
|
|
dwOSVersion = OS_VERSION_WIN2000;
|
|
}
|
|
else
|
|
{
|
|
dwOSVersion = OS_VERSION_WINNT;
|
|
}
|
|
break;
|
|
|
|
case VER_PLATFORM_WIN32_WINDOWS
|
|
: if ((4 < sOSVersionInfo.dwMajorVersion)||((4 == sOSVersionInfo.dwMajorVersion)&&(0 < sOSVersionInfo.dwMinorVersion)))
|
|
{
|
|
dwOSVersion = OS_VERSION_WIN98;
|
|
}
|
|
else
|
|
{
|
|
dwOSVersion = OS_VERSION_WIN95;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return dwOSVersion;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD StrLen(LPCTSTR strString)
|
|
{
|
|
DWORD dwIndex;
|
|
|
|
dwIndex = 0;
|
|
while (0 != strString[dwIndex])
|
|
{
|
|
dwIndex++;
|
|
}
|
|
|
|
return dwIndex;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL GenerateUniqueFilename(LPCTSTR strRootPath, LPCTSTR strExtension, LPTSTR strFilename)
|
|
{
|
|
BOOL fSuccess = FALSE;
|
|
DWORD dwTimeTick;
|
|
DWORD dwIndex, dwRootPathLen;
|
|
LPTSTR strAdjustedRootPath;
|
|
|
|
//
|
|
// Build strAdjustedRootPath
|
|
//
|
|
|
|
dwRootPathLen = StrLen(strRootPath) + 1;
|
|
strAdjustedRootPath = new TCHAR [dwRootPathLen];
|
|
if (NULL != strAdjustedRootPath)
|
|
{
|
|
|
|
#ifdef _UNICODE
|
|
memcpy((LPVOID) strAdjustedRootPath, (LPVOID) strRootPath, (dwRootPathLen * 2));
|
|
#else
|
|
memcpy((LPVOID) strAdjustedRootPath, (LPVOID) strRootPath, dwRootPathLen);
|
|
#endif
|
|
|
|
//
|
|
// If there is a trailing backslash at the end of strRootPath, remove it
|
|
//
|
|
|
|
dwIndex = 0;
|
|
do
|
|
{
|
|
dwIndex++;
|
|
if ((0 == strAdjustedRootPath[dwIndex])&&(92 == strAdjustedRootPath[dwIndex - 1]))
|
|
{
|
|
strAdjustedRootPath[dwIndex - 1] = 0;
|
|
}
|
|
}
|
|
while (0 != strAdjustedRootPath[dwIndex]);
|
|
|
|
//
|
|
// Generate a temporary filename
|
|
//
|
|
|
|
do
|
|
{
|
|
dwTimeTick = GetTickCount();
|
|
wsprintf(strFilename, TEXT("%s\\%08x.%s"), strAdjustedRootPath, dwTimeTick, strExtension);
|
|
if (!FileExists(strFilename))
|
|
{
|
|
fSuccess = TRUE;
|
|
}
|
|
}
|
|
while (!fSuccess);
|
|
|
|
//
|
|
// Dont forget to deallocate strAdjustedRootPath
|
|
//
|
|
|
|
delete [] strAdjustedRootPath;
|
|
}
|
|
|
|
return fSuccess;
|
|
} |