Проверка регистрации класса в системе…

Не знаю, сталкивался ли кто с такой ситуацией, когда необходимо в приложении определить зарегистрирован в системе тот или иной класс, ну, скажем "Wscrip.Shell" или "Word.Application.8"

В качестве параметра передается имя класса "Word.Application.8", а возвращается- путь к файлу или пусто.

LPARA cClassName
*!* Параметр название класса
cClID=fregget('',cClassName+'\CLSID',1)
cFilePath=fregget('','CLSID\'+ALLTRIM(cClID)+'\InProcServer32',1)
if EMPTY (cFilePath)
cFilePath=fregget('','CLSID\'+ALLTRIM(cClID)+'\LocalServer32',1)
ENDIF
*!* Если такой класс зарегистрирован- возвращается путь к файлу, иначе пустая строка.
RETURN ALLTRIM(cFilePath)

*!* Это общая функция чтения данных из реестра 
Function fregget
LPARAMETER name, key,div
*!*	 name имя параметра,значение которого надо получить
*!*	 key полное имя раздела реестра
*!*	 div базовый ключ реестра
*!*	div=1 	HKEY_CLASSES_ROOT           -2147483648  
*!*	div=2	HKEY_CURRENT_USER           -2147483647  
*!*	div=3	HKEY_LOCAL_MACHINE          -2147483646  
*!*	div=4	HKEY_USERS                  -2147483645  
 DECLARE INTEGER RegOpenKey IN Win32API INTEGER, STRING @, INTEGER @
 DECLARE INTEGER RegCloseKey IN Win32API INTEGER
 DECLARE INTEGER RegQueryValueEx IN Win32API INTEGER, STRING, INTEGER, INTEGER @, STRING @,INTEGER @
 PRIVATE keyhandle, data, datalen, path
       IF LEFT(M.key, 1)='\'
           M.path = SUBSTR(M.key, 2)
     ELSE
           M.path = M.key
      ENDIF
 IF PARA()=2
 M.div=-2147483646 
 ELSE
DO CASE
CASE div=1

M.div=-2147483648 
CASE div=2
M.div=-2147483647
CASE div=3
M.div=-2147483646
CASE div=4
M.div=-2147483645
OTHERWISE
M.div=-2147483646 
ENDCASE
 ENDIF
 keyhandle = 0
 data = SPACE(256)
 datalen = LEN(M.data)
 type = 0
 = regopenkey(M.div,M.path,@M.keyhandle)
 = regqueryvalueex(M.keyhandle,M.name,0,@M.type,@M.data,@M.datalen)
 = regclosekey(M.keyhandle)
 DO CASE
      CASE M.type=1

           IF M.datalen < AT(CHR(0), M.data)-1
                M.data = LEFT(M.data, M.datalen)
           ELSE
                M.data = LEFT(M.data, AT(CHR(0), M.data)-1)
           ENDIF
      CASE M.type=4
           nn = 0
           FOR n = M.datalen TO 1 STEP -1
                nn = nn+ASC(SUBSTR(M.data, n,1))*(256^(n-1))

           ENDFOR

           M.data = TRANSFORM(nn, "@0")
           M.data = SUBSTR(M.data, AT('x',M.data)+1)
 ENDCASE
 RETURN M.data

Автор публикации

не в сети 2 месяца

Joys

Комментарии: 2Публикации: 177Регистрация: 25-06-2000
Материалы по теме
1 отзыв на “Проверка регистрации класса в системе…”
  • До боли знакомое дело 🙂
    Замечу только что не совсем корректно обрабатывается возращаемое значение из RegQueryValueEx –
    потому как она еще возвращает код ошибки при размере буфера менее необходимого. Может конечно не
    для данной конкретной ситуации, но у меня написано так

    nErr=RegQueryValueEx(hKey,cValue,0,@ntype,@buf,@buflen)
    If nErr=ERROR_MORE_DATA && ERROR_MORE_DATA
    buf=Replicate(Chr(0),buflen)
    nErr=RegQueryValueEx(hKey,cValue,0,@ntype,@buf,@buflen)
    EndIf

Оставить комментарий
//////////////// ///////////////
Авторизация
*
*
Генерация пароля