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
