FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9239
Вход
Проверка регистрации класса в системе...

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


 
Прислал: Yuri Abramenkov   Категория: Система


Определение регистрации класса в системе...

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

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.941)
Дополнения пользователей
Проверка регистрации класса в системе...
[+][?]
Владислав
10.12.02 14:28:18

Вот возникла необходимость программно отследить - зарегистрирован ли класс. Воспользовался Вашими
функциями. Судя по результатам их работы - такое впечатление, что у меня реестр Windows пустой
(W2k). Или я что-то не так делаю?
Admin note RE:
Видимо при загрузке слеши удалились, исправлено
piva
17.06.05 04:29:56

До боли знакомое дело :)
Замечу только что не совсем корректно обрабатывается возращаемое значение из 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

[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика