我发现,2000中 access加密的数据库,在2003的 access 数据库中暴露无遗!
简直是太致命了!有没有办法判断系统采用的是office是2000 还是 2003!各位帮帮忙!!!

解决方案 »

  1.   

    改用MDB文件头加密,即改变MDB文件的文件头,要用的时候再恢复
      

  2.   

    --讀取註冊表的安裝路徑用以下的方法即可:Option ExplicitPrivate Declare Function RegQueryValueEx& Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey&, ByVal lpszValueName$, ByVal lpdwRes&, lpdwType&, ByVal lpDataBuff$, nSize&)
    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
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Public Function GetExcelPath() As String
    Dim s As String * 255, sVBEntry As String
    Dim lVBKey As Long, lType As Long, lLen As Long, lRC As Long
    Dim sPath As String
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const KEY_QUERY_VALUE = &H1&
    Const KEY_ENUMERATE_SUB_KEYS = &H8&
    Const KEY_NOTIFY = &H10&
    Const READ_CONTROL = &H20000
    Const STANDARD_RIGHTS_READ = READ_CONTROL
    Const KEY_READ = STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY    ' Search for Office 2000 path
        sVBEntry = "SOFTWARE\Microsoft\Office\9.0\Excel\InstallRoot"
        sPath = ""
        lLen = Len(s)
        lRC = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sVBEntry, 0, KEY_READ, lVBKey)
        If lRC = 0 Then
            ' RegOpenKeyEx succeeded
            lRC = RegQueryValueEx(lVBKey, "Path", 0, lType, s, lLen)
            If lRC = 0 Then sPath = Left$(s, lLen - 1)  'RegQueryValueEx succeded
            RegCloseKey lVBKey
        End If    If sPath <> "" Then
            GetExcelPath = sPath
            Exit Function
        End If    ' Office 2000 key not found, search for Office XP  path    sVBEntry = "SOFTWARE\Microsoft\Office\10.0\Excel\InstallRoot"    lLen = Len(s)
        lRC = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sVBEntry, 0, KEY_READ, lVBKey)
        If lRC = 0 Then
            lRC = RegQueryValueEx(lVBKey, "Path", 0, lType, s, lLen)
            If lRC = 0 Then
                sPath = Left$(s, lLen - 1)  ' Office XP key found
            Else
                MsgBox "對不起,沒有找到開啟 Microsoft Excel 的應用程式,請完整安裝 Microsoft Office 2000以上版本.", vbCritical
                sPath = ""
            End If
            RegCloseKey lVBKey
        End If
        GetExcelPath = sPath
    End Function
      

  3.   

    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal samDesired As Long, phkResult As Long) As Long
    Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegEnumKeyEx Lib "advapi32.dll" Alias "RegEnumKeyExA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpName As String, lpcbName As Long, ByVal lpReserved As Long, ByVal lpClass As String, lpcbClass As Long, lpftLastWriteTime As Any) As Long
    Private Declare Function RegEnumValue Lib "advapi32.dll" Alias "RegEnumValueA" (ByVal hKey As Long, ByVal dwIndex As Long, ByVal lpValueName As String, lpcbValueName As Long, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Const HKEY_CLASSES_ROOT = &H80000000
    Const HKEY_CURRENT_USER = &H80000001
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const HKEY_USERS = &H80000003
    Const HKEY_CURRENT_CONFIG = &H80000005
    Const HKEY_DYN_DATA = &H80000006Const ERROR_NO_MORE_ITEMS = 259&
    Const STANDARD_RIGHTS_ALL = &H1F0000
    Const SYNCHRONIZE = &H100000
    Const KEY_CREATE_LINK = &H20
    Const KEY_CREATE_SUB_KEY = &H4
    Const KEY_ENUMERATE_SUB_KEYS = &H8
    Const KEY_NOTIFY = &H10
    Const KEY_QUERY_VALUE = &H1
    Const KEY_SET_VALUE = &H2
    Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))Private Sub Form_Load()
       Dim rlt As Long
       Dim smsg As String
       If RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Microsoft\Office\9.0\Word", 0, KEY_ALL_ACCESS, rlt) = 0 Then
          smsg = "本机已经安装MS Word 2000程序。"
       ElseIf RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Microsoft\Office\10.0\Word", 0, KEY_ALL_ACCESS, rlt) = 0 Then
          smsg = "本机已经安装MS Word XP程序。"
       Else
          smsg = "没有可用MS Word程序。"
       End If
       
       Print smsg
       If RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Microsoft\Office\9.0\Excel", 0, KEY_ALL_ACCESS, rlt) = 0 Then
          smsg = "本机已经安装MS Excel 2000程序。"
       ElseIf RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\Microsoft\Office\10.0\Excel", 0, KEY_ALL_ACCESS, rlt) = 0 Then
          smsg = "本机已经安装MS Excel XP程序。"
       Else
          smsg = "没有可用MS Excel。"
       End If
       Print smsg
       
       RegCloseKey rlt
    End Sub
      

  4.   

    那如果既安装了 2000 又 安装了 2003,并且缺省的 mdb 文件是用 2003 打开怎么办!!!
    能不能判断
    access 的版本 大于2000 的存不存在(当是 2003,或者 下一版本 2005 也出来了 ,而不是10.0)
    或者
    缺省打开mdb文件的程序 是 access 2000