Не знаю, сталкивался ли кто с такой ситуацией, когда необходимо в приложении определить зарегистрирован в системе тот или иной класс, ну, скажем "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
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