| 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 |