FUNCTION IsActiveXReg LPARAMETERS pcClsName, AX_DIAGNOSE * example: TreeView = 'mscomctllib.treectrl' * Author: William GC Steinford * Name of the control: HKEY_CLASSES_ROOT\MSComctlLib.TreeCtrl (Default) * Class GuID: HKEY_CLASSES_ROOT\MSComctlLib.TreeCtrl\CLSID * Current Version Class Name: HKEY_CLASSES_ROOT\MSComctlLib.TreeCtrl\CurVer *LASv10.39: the registry path cannot start with a "\" in Win98, but works in Win2k * Win2k is fine with or without a leading "\" #DEFINE HKEY_CLASSES_ROOT -2147483648 #define ERROR_SUCCESS 0 #define ERROR_BADDB 1 #define ERROR_BADKEY 2 #define ERROR_CANTOPEN 3 #define ERROR_CANTREAD 4 #define ERROR_CANTWRITE 5 #define ERROR_OUTOFMEMORY 6 #define ERROR_INVALID_PARAMETER 7 #define ERROR_ACCESS_DENIED 8 #define REG_SZ 1 Declare LONG RegOpenKey in Win32API INTEGER, STRING, INTEGER @nKeyHandle #DEFINE READ_CONTROL 0x020000 #DEFINE KEY_QUERY_VALUE 0x0001 #DEFINE KEY_ENUMERATE_SUBKEYS 0x0008 #DEFINE KEY_NOTIFY 0x0010 * KEY_READ combines READ_CONTROL, QUERY_VAL, ENUM_SUBKY & NOTIFY: #DEFINE KEY_READ 0x020019 * hKey // handle to open key * LPCTSTR lpSubKey, // subkey name * DWORD ulOptions, // reserved * REGSAM samDesired, // security access mask * PHKEY phkResult // handle to open key DECLARE INTEGER RegOpenKeyEx IN advapi32; INTEGER hKey,; STRING lpSubKey,; INTEGER ulOptions,; INTEGER samDesired,; INTEGER @ phkResult DECLARE LONG RegCloseKey IN Win32API INTEGER nHKey DECLARE INTEGER GetLastError IN Win32api LOCAL lnHKEY, lnRes lnHKEY = 0 lnRes = RegOpenKeyEx( HKEY_CLASSES_ROOT, pcClsName, 0, KEY_READ, @lnHKey ) if 0<>lnRes IF AX_DIAGNOSE RETURN "FAILED:"+tran(lnRes)+": Open ClassName Key (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif lcName = GetRegVal( lnHKey, '' ) RegCloseKey( lnHKey ) if isNull(lcName) IF AX_DIAGNOSE RETURN "FAILED: Read ClassName Default Value = .NULL. (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif lnRes = RegOpenKeyEx( HKEY_CLASSES_ROOT, pcClsName+'\CLSID', 0, KEY_READ, @lnHKey) if 0<>lnRes IF AX_DIAGNOSE RETURN "FAILED:"+tran(lnRes)+": Open ClassName\CLSID Key (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif lcGUID = GetRegVal( lnHKey, '' ) *?"GUID: ",lcGuid RegCloseKey( lnHKey ) if isNull(lcName) IF AX_DIAGNOSE RETURN "FAILED: Read ClassName\CLSID Default Value = .NULL. (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif lnRes = RegOpenKeyEx( HKEY_CLASSES_ROOT, 'CLSID\'+lcGUID, 0, KEY_READ, @lnHKey) if 0<>lnRes IF AX_DIAGNOSE RETURN "FAILED:"+tran(lnRes)+": Open CLSID\GUID Key (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif lcName2 = GetRegVal( lnHKey, '' ) *?"GUID Desc: ",lcName2 RegCloseKey( lnHKey ) lnRes = RegOpenKeyEx( HKEY_CLASSES_ROOT, 'CLSID\'+lcGUID+'\InprocServer32', 0, KEY_READ, @lnHKey) if 0<>lnRes IF AX_DIAGNOSE RETURN "FAILED:"+tran(lnRes)+": Open CLSID\GUID\InprocServer32 Key (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif lcOCX = GetRegVal( lnHKey, '' ) RegCloseKey( lnHKey ) if isNull(lcOcx) IF AX_DIAGNOSE RETURN "FAILED: InprocServer32 is Null (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif IF NOT FILE(XlatEnvVars( lcOcx )) IF AX_DIAGNOSE RETURN "FAILED: InprocServer32 file not found: "+lcOcx+" ("+XlatEnvVars(lcOcx)+") (LastError="+tran(GetLastError())+")" ELSE RETURN .F. ENDIF endif IF AX_DIAGNOSE RETURN "YES" ELSE RETURN .T. ENDIF ENDFUNC ******************************************************************* FUNCTION GetRegVal LPARAMETERS nHKey, cProperty LOCAL Result, lcValue, lnValueLen, lnType DECLARE INTEGER RegQueryValueEx IN WIN32API ; INTEGER hKey, STRING @ lpValueName, INTEGER lpReserved, ; INTEGER @ lpType, STRING @ lpData, INTEGER @ lpcbData if ISNull(nHKey) RETURN .NULL. endif lnType = REG_SZ lcValue = space(255) lnValLen = 255 result = RegQueryValueEx( nHKey, @cProperty, 0, ; @lnType, @lcValue, @lnValLen ) lcValue = Left(lcValue, lnValLen ) do while right(lcValue,1)=chr(0) and (Len(lcValue)>0) lcValue = Left( lcValue, Len(lcValue)-1 ) enddo if Result=ERROR_SUCCESS RETURN lcValue endif RETURN .NULL. ENDFUNC ********************************************** PROCEDURE XlatEnvVars( pcInStr ) DECLARE LONG ExpandEnvironmentStrings IN Win32API ; STRING LPCTSTR_lpSrc, ; && // string with environment variables STRING @ LPTSTR_lpDst, ; && // string with expanded strings LONG nSize && // maximum characters in expanded string LOCAL lcOut, lnLen lcOut = Space(1000) lnLen = ExpandEnvironmentStrings( pcInstr, @lcOut, 1000 ) if lnLen>0 lcOut = Alltrim(lcOut) RETURN lcOut endif RETURN pcInStr ENDPROC