| Attribute VB_Name = "Office10Issues" |
| '************************************************************************* |
| ' |
| ' 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. |
| ' |
| '************************************************************************* |
| |
| 'Disable Option Explicit so this will compile on earlier Office versions |
| 'Option Explicit |
| Public Declare Function RegCloseKey Lib "advapi32.dll" _ |
| (ByVal hKey As Long) As Long |
| Public 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 |
| Public Declare Function RegSetValueEx Lib "advapi32.dll" _ |
| Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, _ |
| ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, _ |
| ByVal cbData As Long) As Long |
| Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal _ |
| hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass _ |
| As String, ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes _ |
| As SECURITY_ATTRIBUTES, phkResult As Long, lpdwDisposition As Long) As Long |
| Public Declare Function RegOpenKey Lib "advapi32.dll" _ |
| Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, _ |
| phkResult As Long) As Long |
| Public Declare Function RegCreateKey Lib "advapi32.dll" _ |
| Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, _ |
| phkResult As Long) As Long |
| Public Declare Function RegDeleteValue Lib "advapi32.dll" _ |
| Alias "RegDeleteValueA" (ByVal hKey As Long, _ |
| ByVal lpValueName As String) As Long |
| Public 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 |
| |
| Type SECURITY_ATTRIBUTES |
| nLength As Long |
| lpSecurityDescriptor As Long |
| bInheritHandle As Long |
| End Type |
| |
| Enum RegHive |
| 'HKEY_CLASSES_ROOT = &H80000000 |
| HK_CR = &H80000000 |
| HKEY_CURRENT_USER = &H80000001 |
| HK_CU = &H80000001 |
| HKEY_LOCAL_MACHINE = &H80000002 |
| HK_LM = &H80000002 |
| HKEY_USERS = &H80000003 |
| HK_US = &H80000003 |
| HKEY_CURRENT_CONFIG = &H80000005 |
| HK_CC = &H80000005 |
| HKEY_DYN_DATA = &H80000006 |
| HK_DD = &H80000006 |
| End Enum |
| |
| Enum RegType |
| REG_SZ = 1 'Unicode nul terminated string |
| REG_BINARY = 3 'Free form binary |
| REG_DWORD = 4 '32-bit number |
| End Enum |
| |
| Const ERROR_SUCCESS = 0 |
| Const KEY_WRITE = &H20006 |
| Const APP_EXCEL = "Excel" |
| Const APP_WORD = "Word" |
| Const APP_PP = "PowerPoint" |
| |
| Public Function CreateRegKey(hKey As RegHive, strPath As String) |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "CreateRegKey" |
| |
| Dim heKey As Long |
| Dim secattr As SECURITY_ATTRIBUTES ' security settings for the key |
| Dim subkey As String ' name of the subkey to create or open |
| Dim neworused As Long ' receives flag for if the key was created or opened |
| Dim stringbuffer As String ' the string to put into the registry |
| Dim retval As Long ' return value |
| |
| ' Set the name of the new key and the default security settings |
| secattr.nLength = Len(secattr) |
| secattr.lpSecurityDescriptor = 0 |
| secattr.bInheritHandle = 1 |
| |
| retval = RegCreateKeyEx(hKey, strPath, 0, "", 0, KEY_WRITE, _ |
| secattr, heKey, neworused) |
| If retval = 0 Then |
| retval = RegCloseKey(hKey) |
| Exit Function |
| End If |
| |
| HandleErrors: |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| End Function |
| |
| Public Function CreateRegKey2(hKey As RegHive, strPath As String) As Long |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "CreateRegKey" |
| CreateRegKey2 = 0 |
| |
| Dim heKey As Long |
| Dim secattr As SECURITY_ATTRIBUTES ' security settings for the key |
| Dim subkey As String ' name of the subkey to create or open |
| Dim neworused As Long ' receives flag for if the key was created or opened |
| Dim stringbuffer As String ' the string to put into the registry |
| Dim retval As Long ' return value |
| |
| ' Set the name of the new key and the default security settings |
| secattr.nLength = Len(secattr) |
| secattr.lpSecurityDescriptor = 0 |
| secattr.bInheritHandle = 1 |
| |
| retval = RegCreateKeyEx(hKey, strPath, 0, "", 0, KEY_WRITE, _ |
| secattr, heKey, neworused) |
| If retval = ERROR_SUCCESS Then |
| CreateRegKey2 = heKey |
| Exit Function |
| End If |
| |
| FinalExit: |
| Exit Function |
| |
| HandleErrors: |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| CreateRegKey2 = 0 |
| GoTo FinalExit |
| End Function |
| |
| |
| Public Function GetRegLong(ByVal hKey As RegHive, ByVal strPath As String, ByVal strValue As String) As Long |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "GetRegLong" |
| |
| Dim lRegResult As Long |
| Dim lValueType As Long |
| Dim lBuffer As Long |
| Dim lDataBufferSize As Long |
| Dim hCurKey As Long |
| |
| GetRegLong = 0 |
| lRegResult = RegOpenKey(hKey, strPath, hCurKey) |
| lDataBufferSize = 4 '4 bytes = 32 bits = long |
| |
| lRegResult = RegQueryValueEx(hCurKey, strValue, 0, REG_DWORD, lBuffer, lDataBufferSize) |
| If lRegResult = ERROR_SUCCESS Then |
| GetRegLong = lBuffer |
| End If |
| lRegResult = RegCloseKey(hCurKey) |
| Exit Function |
| |
| HandleErrors: |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| End Function |
| |
| Public Function SaveRegLong(ByVal hKey As RegHive, ByVal strPath As String, ByVal strValue As String, ByVal lData As Long) |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "SaveRegLong" |
| |
| Const NumofByte = 4 |
| Dim hCurKey As Long |
| Dim lRegResult As Long |
| |
| lRegResult = RegCreateKey(hKey, strPath, hCurKey) |
| lRegResult = RegSetValueEx(hCurKey, strValue, 0&, REG_DWORD, lData, NumofByte) |
| If lRegResult = ERROR_SUCCESS Then |
| lRegResult = RegCloseKey(hCurKey) |
| Exit Function |
| End If |
| |
| HandleErrors: |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| End Function |
| |
| |
| Public Function GiveAccessToMacroProject(application As String, sVersion As String, oldvalue As Long) As Boolean |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "SaveRegLong" |
| GiveAccessToMacroProject = False |
| |
| Const OfficePath = "Software\Policies\Microsoft\Office\" |
| Const security = "\Security" |
| Const AccessVBOM = "AccessVBOM" |
| Const AccessVBOMValue = 1 |
| Dim subpath As String |
| Dim RegistryValue As Long |
| |
| subpath = OfficePath & sVersion & "\" & application & security |
| CreateRegKey HKEY_CURRENT_USER, subpath |
| RegistryValue = GetRegLong(HKEY_CURRENT_USER, subpath, AccessVBOM) |
| oldvalue = RegistryValue |
| SaveRegLong HKEY_CURRENT_USER, subpath, AccessVBOM, AccessVBOMValue |
| GiveAccessToMacroProject = True |
| Exit Function |
| |
| HandleErrors: |
| GiveAccessToMacroProject = False |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| End Function |
| |
| Public Function SetDefaultRegValue(application As String, sVersion As String, sValue As Long) |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "SaveRegLong" |
| |
| Const OfficePath = "Software\Policies\Microsoft\Office\" |
| Const security = "\Security" |
| Const AccessVBOM = "AccessVBOM" |
| Dim subpath As String |
| |
| subpath = OfficePath & sVersion & "\" & application & security |
| SaveRegLong HKEY_CURRENT_USER, subpath, AccessVBOM, sValue |
| Exit Function |
| |
| HandleErrors: |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| End Function |
| Public Function DeleteRegValue(application As String, sVersion As String) |
| On Error GoTo HandleErrors |
| Dim currentFunctionName As String |
| currentFunctionName = "SaveRegLong" |
| |
| Const OfficePath = "Software\Policies\Microsoft\Office\" |
| Const security = "\Security" |
| Const AccessVBOM = "AccessVBOM" |
| Dim subpath As String |
| Dim retval As Long |
| Dim hKey As Long |
| |
| subpath = OfficePath & sVersion & "\" & application & security |
| retval = RegOpenKeyEx(HKEY_CURRENT_USER, subpath, 0, KEY_WRITE, hKey) |
| If retval = ERROR_SUCCESS Then |
| retval = RegDeleteValue(hKey, AccessVBOM) |
| retval = RegCloseKey(hKey) |
| Exit Function |
| End If |
| |
| HandleErrors: |
| WriteDebug currentFunctionName & " : " & Err.Number & " " & Err.Description & " " & Err.Source |
| End Function |
| |
| Public Function CheckForAccesToWordVBProject1(wrd As Word.application, RestoreValue As Long) As Boolean |
| On Error Resume Next |
| CheckForAccesToWordVBProject1 = True |
| RestoreValue = -1 |
| If val(wrd.Version) < 10# Then Exit Function |
| |
| Set myProject = wrd.ActiveDocument.VBProject |
| If Err.Number <> 0 Then |
| Dim RegValue As Long |
| If GiveAccessToMacroProject(APP_WORD, wrd.Version, RegValue) Then |
| CheckForAccesToWordVBProject1 = True |
| RestoreValue = RegValue |
| Else |
| CheckForAccesToWordVBProject1 = False |
| End If |
| End If |
| |
| End Function |
| Public Function CheckForAccesToWordVBProject(wrd As Word.application) As Boolean |
| On Error Resume Next |
| CheckForAccesToWordVBProject = True |
| If val(wrd.Version) < 10# Then Exit Function |
| |
| Set myProject = wrd.ActiveDocument.VBProject |
| If Err.Number <> 0 Then |
| CheckForAccesToWordVBProject = False |
| End If |
| |
| End Function |
| Public Function CheckForAccesToExcelVBProject1(xl As Excel.application, RestoreValue As Long) As Boolean |
| On Error Resume Next |
| CheckForAccesToExcelVBProject1 = True |
| RestoreValue = -1 |
| If val(xl.Version) < 10# Then Exit Function |
| |
| Dim displayAlerts As Boolean |
| displayAlerts = xl.displayAlerts |
| xl.displayAlerts = False |
| Set myProject = xl.ActiveWorkbook.VBProject |
| If Err.Number <> 0 Then |
| Dim RegValue As Long |
| If GiveAccessToMacroProject(APP_EXCEL, xl.Version, RegValue) Then |
| CheckForAccesToExcelVBProject1 = True |
| RestoreValue = RegValue |
| Else |
| CheckForAccesToExcelVBProject1 = False |
| End If |
| End If |
| xl.displayAlerts = displayAlerts |
| |
| End Function |
| Public Function CheckForAccesToExcelVBProject(xl As Excel.application) As Boolean |
| On Error Resume Next |
| CheckForAccesToExcelVBProject = True |
| If val(xl.Version) < 10# Then Exit Function |
| |
| Dim displayAlerts As Boolean |
| displayAlerts = xl.displayAlerts |
| xl.displayAlerts = False |
| Set myProject = xl.ActiveWorkbook.VBProject |
| If Err.Number <> 0 Then |
| CheckForAccesToExcelVBProject = False |
| End If |
| xl.displayAlerts = displayAlerts |
| |
| End Function |
| Public Function CheckForAccesToPPVBProject1(pp As PowerPoint.application, pres As PowerPoint.Presentation, RestoreValue As Long) As Boolean |
| On Error Resume Next |
| CheckForAccesToPPVBProject1 = True |
| RestoreValue = -1 |
| If val(pp.Version) < 10# Then Exit Function |
| |
| Set myProject = pres.VBProject |
| If Err.Number <> 0 Then |
| Dim RegValue As Long |
| If GiveAccessToMacroProject(APP_PP, pp.Version, RegValue) Then |
| CheckForAccesToPPVBProject1 = True |
| RestoreValue = RegValue |
| Else |
| CheckForAccesToPPVBProject1 = False |
| End If |
| End If |
| End Function |
| |
| Public Function CheckForAccesToPPVBProject(pp As PowerPoint.application, pres As PowerPoint.Presentation) As Boolean |
| On Error Resume Next |
| CheckForAccesToPPVBProject = True |
| If val(pp.Version) < 10# Then Exit Function |
| |
| Set myProject = pres.VBProject |
| If Err.Number <> 0 Then |
| CheckForAccesToPPVBProject = False |
| End If |
| End Function |