** If the function returns -1 class is not registered
** If the function returns 0 cannot determine the version
** but the class is registered
** otherwise returns the CurrentVersion of Application
** I tested it ONLY on MicroSoft Word/Excel
? IsClassRegistered("Word.Application")
FUNCTION IsClassRegistered(tcClass)
LOCAL lnKey
#define HKEY_CLASSES_ROOT -2147483648
#define ERROR_SUCCESS 0 && OK
DECLARE INTEGER RegOpenKey IN Win32API ;
INTEGER nHKey, STRING @cSubKey, INTEGER @nResult
DECLARE INTEGER RegCloseKey IN Win32API ;
INTEGER nHKey
DECLARE Integer RegQueryValueEx IN Win32API ;
Integer nHKey, String lpszValueName, Integer dwReserved,;
Integer @lpdwType, String @lpbData, Integer @lpcbData
lnKey = 0
llRetVal = (RegOpenKey(HKEY_CLASSES_ROOT, tcClass, @lnKey) = ERROR_SUCCESS)
IF llRetVal
LOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCode
STORE 0 TO lpdwReserved,lpdwType
STORE SPACE(256) TO lpbData
STORE LEN(m.lpbData) TO m.lpcbData
lnKeyVer = 0
llRetVal = (RegOpenKey(HKEY_CLASSES_ROOT, tcClass+"\CurVer", @lnKeyVer) = ERROR_SUCCESS)
IF llRetVal
IF RegQueryValueEx(lnKeyVer,"", m.lpdwReserved,@lpdwType,@lpbData,@lpcbData) # ERROR_SUCCESS
llRetVal = 0
ELSE
llRetVal = LEFT(m.lpbData,m.lpcbData-1)
llRetVal = INT(VAL(SUBSTR(llRetVal,RAT([.],llRetVal)+1)))
ENDIF
RegCloseKey(lnKeyVer)
ELSE
llRetVal = 0
ENDIF
RegCloseKey(lnKey)
ELSE
llRetVal = -1
ENDIF
RETURN llRetVal
Borislav Borissov