Attribute VB_Name = "Utilities" | |
'************************************************************************* | |
' | |
' Licensed to the Apache Software Foundation (ASF) under one | |
' or more contributor license agreements. See the NOTICE file | |
' distributed with this work for additional information | |
' regarding copyright ownership. The ASF licenses this file | |
' to you under the Apache License, Version 2.0 (the | |
' "License"); you may not use this file except in compliance | |
' with the License. You may obtain a copy of the License at | |
' | |
' http://www.apache.org/licenses/LICENSE-2.0 | |
' | |
' Unless required by applicable law or agreed to in writing, | |
' software distributed under the License is distributed on an | |
' "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
' KIND, either express or implied. See the License for the | |
' specific language governing permissions and limitations | |
' under the License. | |
' | |
'************************************************************************* | |
Option Explicit | |
Public Const LOCALE_ILANGUAGE As Long = &H1 'language id | |
Public Const LOCALE_SLANGUAGE As Long = &H2 'localized name of lang | |
Public Const LOCALE_SENGLANGUAGE As Long = &H1001 'English name of lang | |
Public Const LOCALE_SABBREVLANGNAME As Long = &H3 'abbreviated lang name | |
Public Const LOCALE_SNATIVELANGNAME As Long = &H4 'native name of lang | |
Public Const LOCALE_ICOUNTRY As Long = &H5 'country code | |
Public Const LOCALE_SCOUNTRY As Long = &H6 'localized name of country | |
Public Const LOCALE_SENGCOUNTRY As Long = &H1002 'English name of country | |
Public Const LOCALE_SABBREVCTRYNAME As Long = &H7 'abbreviated country name | |
Public Const LOCALE_SNATIVECTRYNAME As Long = &H8 'native name of country | |
Public Const LOCALE_SINTLSYMBOL As Long = &H15 'intl monetary symbol | |
Public Const LOCALE_IDEFAULTLANGUAGE As Long = &H9 'def language id | |
Public Const LOCALE_IDEFAULTCOUNTRY As Long = &HA 'def country code | |
Public Const LOCALE_IDEFAULTCODEPAGE As Long = &HB 'def oem code page | |
Public Const LOCALE_IDEFAULTANSICODEPAGE As Long = &H1004 'def ansi code page | |
Public Const LOCALE_IDEFAULTMACCODEPAGE As Long = &H1011 'def mac code page | |
Public Const LOCALE_IMEASURE As Long = &HD '0 = metric, 1 = US | |
Public Const LOCALE_SSHORTDATE As Long = &H1F 'short date format string | |
'#if(WINVER >= &H0400) | |
Public Const LOCALE_SISO639LANGNAME As Long = &H59 'ISO abbreviated language name | |
Public Const LOCALE_SISO3166CTRYNAME As Long = &H5A 'ISO abbreviated country name | |
'#endif /* WINVER >= as long = &H0400 */ | |
'#if(WINVER >= &H0500) | |
Public Const LOCALE_SNATIVECURRNAME As Long = &H1008 'native name of currency | |
Public Const LOCALE_IDEFAULTEBCDICCODEPAGE As Long = &H1012 'default ebcdic code page | |
Public Const LOCALE_SSORTNAME As Long = &H1013 'sort name | |
'#endif /* WINVER >= &H0500 */ | |
Public Const CSTR_LOG_FILE_NAME = "analysis.log" | |
Public Declare Function GetThreadLocale Lib "kernel32" () As Long | |
Public Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long | |
Public Declare Function GetUserDefaultLCID Lib "kernel32" () As Long | |
Public Declare Function GetUserDefaultLangID Lib "kernel32" () As Long | |
Public Declare Function GetSystemDefaultLangID Lib "kernel32" () As Long | |
Public Declare Function GetLocaleInfo Lib "kernel32" _ | |
Alias "GetLocaleInfoA" _ | |
(ByVal Locale As Long, _ | |
ByVal LCType As Long, _ | |
ByVal lpLCData As String, _ | |
ByVal cchData As Long) As Long | |
Private Const VER_PLATFORM_WIN32s = 0 | |
Private Const VER_PLATFORM_WIN32_WINDOWS = 1 | |
Private Const VER_PLATFORM_WIN32_NT = 2 | |
Private Type OSVERSIONINFO | |
OSVSize As Long 'size, in bytes, of this data structure | |
dwVerMajor As Long 'ie NT 3.51, dwVerMajor = 3; NT 4.0, dwVerMajor = 4. | |
dwVerMinor As Long 'ie NT 3.51, dwVerMinor = 51; NT 4.0, dwVerMinor= 0. | |
dwBuildNumber As Long 'NT: build number of the OS | |
'Win9x: build number of the OS in low-order word. | |
' High-order word contains major & minor ver nos. | |
PlatformID As Long 'Identifies the operating system platform. | |
szCSDVersion As String * 128 'NT: string, such as "Service Pack 3" | |
'Win9x: string providing arbitrary additional information | |
End Type | |
Public Type RGB_WINVER | |
PlatformID As Long | |
VersionName As String | |
VersionNo As String | |
ServicePack As String | |
BuildNo As String | |
End Type | |
'defined As Any to support OSVERSIONINFO and OSVERSIONINFOEX | |
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _ | |
(lpVersionInformation As Any) As Long | |
Private Declare Function GetDesktopWindow Lib "user32" () As Long | |
Private Declare Function ShellExecute Lib "shell32" _ | |
Alias "ShellExecuteA" _ | |
(ByVal hWnd As Long, _ | |
ByVal lpOperation As String, _ | |
ByVal lpFile As String, _ | |
ByVal lpParameters As String, _ | |
ByVal lpDirectory As String, _ | |
ByVal nShowCmd As Long) As Long | |
Public Const SW_SHOWNORMAL As Long = 1 | |
Public Const SW_SHOWMAXIMIZED As Long = 3 | |
Public Const SW_SHOWDEFAULT As Long = 10 | |
Public Const SE_ERR_NOASSOC As Long = 31 | |
Public Const CNO_OPTIONAL_PARAM = "_NoOptionalParam_" | |
Private Declare Function WritePrivateProfileString Lib "kernel32" _ | |
Alias "WritePrivateProfileStringA" _ | |
(ByVal lpSectionName As String, _ | |
ByVal lpKeyName As Any, _ | |
ByVal lpString As Any, _ | |
ByVal lpFileName As String) As Long | |
Public Const HKEY_LOCAL_MACHINE As Long = &H80000002 | |
Public Const HKEY_CLASSES_ROOT = &H80000000 | |
Private Const ERROR_MORE_DATA = 234 | |
Private Const ERROR_SUCCESS As Long = 0 | |
Private Const KEY_QUERY_VALUE As Long = &H1 | |
Private Const KEY_ENUMERATE_SUB_KEYS As Long = &H8 | |
Private Const KEY_NOTIFY As Long = &H10 | |
Private Const STANDARD_RIGHTS_READ As Long = &H20000 | |
Private Const SYNCHRONIZE As Long = &H100000 | |
Private Const KEY_READ As Long = ((STANDARD_RIGHTS_READ Or _ | |
KEY_QUERY_VALUE Or _ | |
KEY_ENUMERATE_SUB_KEYS Or _ | |
KEY_NOTIFY) And _ | |
(Not SYNCHRONIZE)) | |
Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _ | |
Alias "RegOpenKeyExA" _ | |
(ByVal hKey As Long, _ | |
ByVal lpSubKey As String, _ | |
ByVal ulOptions As Long, _ | |
ByVal samDesired As Long, _ | |
phkResult As Long) As Long | |
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _ | |
Alias "RegQueryValueExA" _ | |
(ByVal hKey As Long, _ | |
ByVal lpValueName As String, _ | |
ByVal lpReserved As Long, _ | |
lpType As Long, _ | |
lpData As Any, _ | |
lpcbData As Long) As Long | |
Private Declare Function RegCloseKey Lib "advapi32.dll" _ | |
(ByVal hKey As Long) As Long | |
Private Declare Function lstrlenW Lib "kernel32" _ | |
(ByVal lpString As Long) As Long | |
Private Type ShortItemId | |
cb As Long | |
abID As Byte | |
End Type | |
Private Type ITEMIDLIST | |
mkid As ShortItemId | |
End Type | |
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _ | |
(ByVal pidl As Long, ByVal pszPath As String) As Long | |
Private Declare Function SHGetSpecialFolderLocation Lib _ | |
"shell32.dll" (ByVal hWndOwner As Long, ByVal nFolder _ | |
As Long, pidl As ITEMIDLIST) As Long | |
Public Function IsWin98Plus() As Boolean | |
'returns True if running Windows 2000 or later | |
Dim osv As OSVERSIONINFO | |
osv.OSVSize = Len(osv) | |
If GetVersionEx(osv) = 1 Then | |
Select Case osv.PlatformID 'win 32 | |
Case VER_PLATFORM_WIN32s: | |
IsWin98Plus = False | |
Exit Function | |
Case VER_PLATFORM_WIN32_NT: 'win nt, 2000, xp | |
IsWin98Plus = True | |
Exit Function | |
Case VER_PLATFORM_WIN32_WINDOWS: | |
Select Case osv.dwVerMinor | |
Case 0: 'win95 | |
IsWin98Plus = False | |
Exit Function | |
Case 90: 'Windows ME | |
IsWin98Plus = True | |
Exit Function | |
Case 10: ' Windows 98 | |
If osv.dwBuildNumber >= 2222 Then 'second edition | |
IsWin98Plus = True | |
Exit Function | |
Else | |
IsWin98Plus = False | |
Exit Function | |
End If | |
End Select | |
Case Else | |
IsWin98Plus = False | |
Exit Function | |
End Select | |
End If | |
End Function | |
Public Function GetWinVersion(WIN As RGB_WINVER) As String | |
'returns a structure (RGB_WINVER) | |
'filled with OS information | |
#If Win32 Then | |
Dim osv As OSVERSIONINFO | |
Dim pos As Integer | |
Dim sVer As String | |
Dim sBuild As String | |
osv.OSVSize = Len(osv) | |
If GetVersionEx(osv) = 1 Then | |
'PlatformId contains a value representing the OS | |
WIN.PlatformID = osv.PlatformID | |
Select Case osv.PlatformID | |
Case VER_PLATFORM_WIN32s: WIN.VersionName = "Win32s" | |
Case VER_PLATFORM_WIN32_NT: WIN.VersionName = "Windows NT" | |
Select Case osv.dwVerMajor | |
Case 4: WIN.VersionName = "Windows NT" | |
Case 5: | |
Select Case osv.dwVerMinor | |
Case 0: WIN.VersionName = "Windows 2000" | |
Case 1: WIN.VersionName = "Windows XP" | |
End Select | |
End Select | |
Case VER_PLATFORM_WIN32_WINDOWS: | |
'The dwVerMinor bit tells if its 95 or 98. | |
Select Case osv.dwVerMinor | |
Case 0: WIN.VersionName = "Windows 95" | |
Case 90: WIN.VersionName = "Windows ME" | |
Case Else: WIN.VersionName = "Windows 98" | |
End Select | |
End Select | |
'Get the version number | |
WIN.VersionNo = osv.dwVerMajor & "." & osv.dwVerMinor | |
'Get the build | |
WIN.BuildNo = (osv.dwBuildNumber And &HFFFF&) | |
'Any additional info. In Win9x, this can be | |
'"any arbitrary string" provided by the | |
'manufacturer. In NT, this is the service pack. | |
pos = InStr(osv.szCSDVersion, Chr$(0)) | |
If pos Then | |
WIN.ServicePack = Left$(osv.szCSDVersion, pos - 1) | |
End If | |
End If | |
#Else | |
'can only return that this does not | |
'support the 32 bit call, so must be Win3x | |
WIN.VersionName = "Windows 3.x" | |
#End If | |
GetWinVersion = WIN.VersionName | |
End Function | |
Public Sub RunShellExecute(sTopic As String, _ | |
sFile As Variant, _ | |
sParams As Variant, _ | |
sDirectory As Variant, _ | |
nShowCmd As Long) | |
Dim hWndDesk As Long | |
Dim success As Long | |
'the desktop will be the | |
'default for error messages | |
hWndDesk = GetDesktopWindow() | |
'execute the passed operation | |
success = ShellExecute(hWndDesk, sTopic, sFile, sParams, sDirectory, nShowCmd) | |
'This is optional. Uncomment the three lines | |
'below to have the "Open With.." dialog appear | |
'when the ShellExecute API call fails | |
If success = SE_ERR_NOASSOC Then | |
Call Shell("rundll32.exe shell32.dll,OpenAs_RunDLL " & sFile, vbNormalFocus) | |
End If | |
End Sub | |
Public Sub WriteToLog(key As String, value As String, _ | |
Optional path As String = CNO_OPTIONAL_PARAM, _ | |
Optional section As String = WIZARD_NAME) | |
Static logFile As String | |
If logFile = "" Then | |
logFile = GetLogFilePath | |
End If | |
If path = "" Then | |
Exit Sub | |
End If | |
If path = CNO_OPTIONAL_PARAM Then | |
path = logFile | |
End If | |
Call WritePrivateProfileString(section, key, value, path) | |
End Sub | |
Public Sub WriteDebug(value As String) | |
Static ErrCount As Long | |
Static logFile As String | |
Static debugLevel As Long | |
If logFile = "" Then | |
logFile = GetLogFilePath | |
End If | |
Dim sSection As String | |
sSection = WIZARD_NAME & "Debug" | |
Call WritePrivateProfileString(sSection, "Analysis" & "_debug" & ErrCount, _ | |
value, logFile) | |
ErrCount = ErrCount + 1 | |
End Sub | |
Public Function GetDebug(section As String, key As String) As String | |
Static logFile As String | |
If logFile = "" Then | |
logFile = GetLogFilePath | |
End If | |
GetDebug = ProfileGetItem(section, key, "", logFile) | |
End Function | |
Public Function GetUserLocaleInfo(ByVal dwLocaleID As Long, ByVal dwLCType As Long) As String | |
Dim sReturn As String | |
Dim r As Long | |
'call the function passing the Locale type | |
'variable to retrieve the required size of | |
'the string buffer needed | |
r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn)) | |
'if successful.. | |
If r Then | |
'pad the buffer with spaces | |
sReturn = Space$(r) | |
'and call again passing the buffer | |
r = GetLocaleInfo(dwLocaleID, dwLCType, sReturn, Len(sReturn)) | |
'if successful (r > 0) | |
If r Then | |
'r holds the size of the string | |
'including the terminating null | |
GetUserLocaleInfo = Left$(sReturn, r - 1) | |
End If | |
End If | |
End Function | |
Public Function GetRegistryInfo(sHive As String, sSubKey As String, sKey As String) As String | |
GetRegistryInfo = "" | |
Dim hKey As Long | |
hKey = OpenRegKey(sHive, sSubKey) | |
If hKey <> 0 Then | |
GetRegistryInfo = GetRegValue(hKey, sKey) | |
'the opened key must be closed | |
Call RegCloseKey(hKey) | |
End If | |
End Function | |
Private Function GetRegValue(hSubKey As Long, sKeyName As String) As String | |
Dim lpValue As String 'value retrieved | |
Dim lpcbData As Long 'length of retrieved string | |
'if valid | |
If hSubKey <> 0 Then | |
'Pass an zero-length string to | |
'obtain the required buffer size | |
'required to return the result. | |
'If the key passed exists, the call | |
'will return error 234 (more data) | |
'and lpcbData will indicate the | |
'required buffer size (including | |
'the terminating null). | |
lpValue = "" | |
lpcbData = 0 | |
If RegQueryValueEx(hSubKey, _ | |
sKeyName, _ | |
0&, _ | |
0&, _ | |
ByVal lpValue, _ | |
lpcbData) = ERROR_MORE_DATA Then | |
lpValue = Space$(lpcbData) | |
'retrieve the desired value | |
If RegQueryValueEx(hSubKey, _ | |
sKeyName, _ | |
0&, _ | |
0&, _ | |
ByVal lpValue, _ | |
lpcbData) = ERROR_SUCCESS Then | |
GetRegValue = TrimNull(lpValue) | |
End If 'If RegQueryValueEx (second call) | |
End If 'If RegQueryValueEx (first call) | |
End If 'If hSubKey | |
End Function | |
Private Function OpenRegKey(ByVal hKey As Long, _ | |
ByVal lpSubKey As String) As Long | |
Dim hSubKey As Long | |
Dim retval As Long | |
retval = RegOpenKeyEx(hKey, lpSubKey, _ | |
0, KEY_READ, hSubKey) | |
If retval = ERROR_SUCCESS Then | |
OpenRegKey = hSubKey | |
End If | |
End Function | |
Private Function TrimNull(startstr As String) As String | |
TrimNull = Left$(startstr, lstrlenW(StrPtr(startstr))) | |
End Function | |
Function GetLogFilePath() As String | |
Dim fso As New FileSystemObject | |
Dim TempPath As String | |
TempPath = fso.GetSpecialFolder(TemporaryFolder).path | |
If (TempPath = "") Then | |
TempPath = "." | |
End If | |
GetLogFilePath = fso.GetAbsolutePathName(TempPath & "\" & CSTR_LOG_FILE_NAME) | |
End Function | |
Function GetIniFilePath() As String | |
Dim fso As New FileSystemObject | |
Dim AppDataDir As String | |
AppDataDir = GetAppDataFolder | |
If (AppDataDir = "") Then | |
AppDataDir = CBASE_RESOURCE_DIR | |
Else | |
If Not fso.FolderExists(AppDataDir) Then | |
fso.CreateFolder (AppDataDir) | |
End If | |
AppDataDir = AppDataDir & "\Sun" | |
If Not fso.FolderExists(AppDataDir) Then | |
fso.CreateFolder (AppDataDir) | |
End If | |
AppDataDir = AppDataDir & "\AnalysisWizard" | |
If Not fso.FolderExists(AppDataDir) Then | |
fso.CreateFolder (AppDataDir) | |
End If | |
End If | |
GetIniFilePath = fso.GetAbsolutePathName(AppDataDir & "\" & CANALYSIS_INI_FILE) | |
End Function | |
' This function returns the Application Data Folder Path | |
Function GetAppDataFolder() As String | |
Dim idlstr As Long | |
Dim sPath As String | |
Dim IDL As ITEMIDLIST | |
Const NOERROR = 0 | |
Const MAX_LENGTH = 260 | |
Const CSIDL_APPDATA = &H1A | |
On Error GoTo Err_GetFolder | |
' Fill the idl structure with the specified folder item. | |
idlstr = SHGetSpecialFolderLocation(0, CSIDL_APPDATA, IDL) | |
If idlstr = NOERROR Then | |
' Get the path from the idl list, and return | |
' the folder with a slash at the end. | |
sPath = Space$(MAX_LENGTH) | |
idlstr = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath) | |
If idlstr Then | |
GetAppDataFolder = Left$(sPath, InStr(sPath, Chr$(0)) - 1) | |
End If | |
End If | |
Exit_GetFolder: | |
Exit Function | |
Err_GetFolder: | |
MsgBox "An Error was Encountered" & Chr(13) & Err.Description, _ | |
vbCritical Or vbOKOnly | |
Resume Exit_GetFolder | |
End Function | |