I have changed how I get the shell path for Acrobat Reader based on
code posted by John deKrafft. Does anyone see any problems with this
code running on various Windows OS's?
'--Begin Module Code
'Support functions and constants for reading a string from the
registry
'I have modified the code posted by John deKrafft slightly
'----
Declare Function RegQueryValueEx Lib "advapi32.d ll" Alias
"RegQueryValueE xA" (ByVal hKey As Long, ByVal lpValueName As String,
ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As
Long) As Long
Declare Function RegOpenKeyEx Lib "advapi32.d ll" Alias
"RegOpenKey ExA" (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.d ll" (ByVal hKey As Long)
As Long
Public Const SYNCHRONIZE As Long = &H100000
Public Const STANDARD_RIGHTS _ALL As Long = &H1F0000
Public Const KEY_QUERY_VALUE As Long = &H1
Public Const KEY_SET_VALUE As Long = &H2
Public Const KEY_CREATE_SUB_ KEY As Long = &H4
Public Const KEY_ENUMERATE_S UB_KEYS As Long = &H8
Public Const KEY_NOTIFY As Long = &H10
Public Const KEY_CREATE_LINK As Long = &H20
Public Const KEY_ALL_ACCESS As Long = ((STANDARD_RIGH TS_ALL Or _
KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_ KEY Or _
KEY_ENUMERATE_S UB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK ) And (Not
SYNCHRONIZE))
Public Const ERROR_SUCCESS As Long = 0
Public Const HKEY_LOCAL_MACH INE As Long = &H80000002
Public Const HKEY_CLASSES_RO OT As Long = &H80000000 'Added
Public Function GetRegistryStri ng(lngKey As Long, strSubKey As String,
strValue As String) As String
Dim lngDataType As Long
Dim lngDataLength As Long
Dim strDataString As String
Dim lngResult As Long
Dim lngHandle As Long
Const StringLength = 150
strDataString = Space(StringLen gth)
lngDataType = 0
lngDataLength = CLng(StringLeng th)
lngResult = RegOpenKeyEx(ln gKey, strSubKey, 0, KEY_ALL_ACCESS,
lngHandle)
If lngResult <ERROR_SUCCES S Then
GetRegistryStri ng = "Error"
Exit Function
End If
lngResult = RegQueryValueEx (lngHandle, strValue, 0, lngDataType, ByVal
strDataString, lngDataLength)
If lngResult <ERROR_SUCCES S Then
GetRegistryStri ng = "Error"
lngResult = RegCloseKey(lng Handle)
Exit Function
End If
strDataString = Left(strDataStr ing, lngDataLength)
'Clean the string in a way that works for either registry key option
used in GetAcrobatReade rShellPath()
'Remove a doublequote from the beginning of the string, if present
If Len(strDataStri ng) 0 Then
If Left(strDataStr ing, 1) = Chr(34) Then strDataString =
Right(strDataSt ring, Len(strDataStri ng) - 1)
End If
'Delete an extra character if present
If Right(strDataSt ring, 3) <"exe" And Len(strDataStri ng) 0 Then
strDataString = Left(strDataStr ing, Len(strDataStri ng) - 1)
'Remove a doublequote from the end of the string, if present
If Len(strDataStri ng) 0 Then
If Right(strDataSt ring, 1) = Chr(34) Then strDataString =
Left(strDataStr ing, Len(strDataStri ng) - 1)
End If
'Make sure the string ends with "exe"
If Right(strDataSt ring, 3) = "exe" Then
GetRegistryStri ng = Left(strDataStr ing, lngDataLength)
Else
GetRegistryStri ng = "Error"
End If
lngResult = RegCloseKey(lng Handle)
End Function
'----
Public Function GetAcrobatReade rShellPath() As String
'Note: The better key to use may be HKEY_CLASSES_RO OT\Software\Ado be
\Acrobat\Exe
'since a user might have Acrobat installed and uses it instead of
Acrobat Reader
'If Acrobat is not installed it seems to get set to the Acrobat Reader
path
'GetAcrobatRead erShellPath = GetRegistryStri ng(HKEY_LOCAL_M ACHINE,
"SOFTWARE\Micro soft\Windows\Cu rrentVersion\Ap p Paths\AcroRd32. exe",
"")
GetAcrobatReade rShellPath = GetRegistryStri ng(HKEY_CLASSES _ROOT,
"Software\Adobe \Acrobat\Exe", "")
End Function
'--End Module Code
Also, is there an even better registry key to use?
Thanks,
James A. Fortune
CD********@Fort uneJames.com
MP*******@Fortu neJames.com