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

Не знаю, сталкивался ли кто с такой ситуацией, когда необходимо в приложении определить:

зарегистрирован в системе тот или иной класс, ну, скажем "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

Автор: Yuri Abramenkov

0

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

не в сети 1 год

Joys

2
Комментарии: 5Публикации: 200Регистрация: 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

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