Не знаю, сталкивался ли кто с такой ситуацией, когда необходимо в приложении определить:
зарегистрирован в системе тот или иной класс, ну, скажем "Wscrip.Shell" или "Word.Application.8"
Посмотрев в реестр, нашел решение.
В качестве параметра передается имя класса "Word.Application.8", а возвращается- путь к файлу или пусто.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
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
1 thought on “Проверка регистрации класса в системе…”
До боли знакомое дело 🙂
Замечу только что не совсем корректно обрабатывается возращаемое значение из RegQueryValueEx –
потому как она еще возвращает код ошибки при размере буфера менее необходимого. Может конечно не
для данной конкретной ситуации, но у меня написано так