blob: 5d266762406396d9d84c22922409e1859dad476c [file] [log] [blame]
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