:: Visual Foxpro, Foxpro for DOS
Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Привет всем.
Как найти путь до dll от COM Server зная ProgID вручную и программно?



Исправлено 2 раз(а). Последнее : AdamAry, 17.03.17 13:02
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Смотря как она зарегистрирована в реестре... Если напрямую, без использования механизма Advertisement имеющегося в системе установки Windows Installer, то процесс поиска dll сравнительно несложен.
В HKCR ищется ProgID - в нём в ветке CLSID значение по умолчанию (это и есть CLSID данного компонента). По этому значению ищется ветка в HKCR\CLSID\{....} - это собственно ветка описания установленного компонента. Далее в зависимости от типа ком-сервера в подветке InprocServer32, или LocalServer32 будет значение по умолчанию с путём к dll/ocx/exe файлу экспортирующему класс данного ком-сервера.

Для .net-овских классов публикуемых посредством regasm структура будет другой.

Вообще такого рода информацию редко когда нужно выяснять...


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Спасибо.
Согласен, редко, но иногда необходимо.

Интересно, почему такая примитивнейшая задача требует таких сложных манипуляций, это что в штатах одни дауны и не кому больше писать программы или все нормальные люди там занимаются чем угодно но не программированием или там запрет нормальным людям писать программы или специально усложняются простейшие вещи чтобы отбить охоту у нормальных людей заниматься программированием?

Механизм Advertisement так понимаю только для NET программ
или она может использоваться и для неуправляемых dll?

В моём случае это не NET программа,
a написанная на неуправляемом C++ dll ~ COM Server.



Исправлено 5 раз(а). Последнее : AdamAry, 17.03.17 13:49
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
AdamAry
Спасибо.
Согласен, редко, но иногда необходимо.

Интересно, почему такая примитивнейшая задача требует таких сложных манипуляций, это что в штатах одни дауны и не кому больше писать программы
или все нормальные люди там занимаются чем угодно но не программированием или там запрет нормальным людям писать программы?
Чем меньше человек разбирается в теме, тем больше он мнит себя знатоком того, что и как должно быть в этой теме и свысока оценивать действия других.
Самому-то для чего понадобилось? А точно нужно именно это?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/2 positive
Re: Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Согласен, но "На всякого мудреца довольно простоты" и всё таки как не крути
этот крутой "Гениальный" код ~ гкод всё равно всего лишь гкод.
И этот гкод даже в студию нести не нужно он у каждого на компе.
Знатоком себя не считаю, поэтому и на форуме, истинные знатоки похоже форумы не посещают, наверное они вообще не делают ошибок и пишут преидеальнейший код.
На всякий случай. Не точно.

На всякий случай:
1. у меня есть две DLL с одинаковым названием но в разных папках,
и надо знать программно которая сейчас текущая, выясняя папку где гнездится dll,
так как могу и забыть какая текущая, программно это удобней т.к. это получается в один клик, чем ковыряться в реестре.

Не точно:
2. есть одна DLL которую админы могут поставить в любую папку и зарегистрировать,
и может появиться необходимость выяснения пути этой папки программнo, зная лишь ProgID этого COM объекта.



Исправлено 14 раз(а). Последнее : AdamAry, 23.03.17 14:40
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AdamAry
Интересно, почему такая примитивнейшая задача требует таких сложных манипуляций
Потому что она лишь кажется тебе примитивной
Это ОЧЕНЬ непростая система - там и разные типы компонент, варианты активации, DCOM, потоковые модели, библиотеки типов, интерфейсы...
AdamAry
Механизм Advertisement
Я привёл ссылку - это механизм штатной системы инсталляции (установки) программ в винде. Позволяет не копировать физически файлы до появления первой надобности в них, плюс отслеживает целостность установки - т.е. восстанавливает повреждённые/удалённые файлы. К .NET не имеет никакого отношения.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Благодарю Игорь. Согласен с тобой:

Создаём COM объект используя ProgID = "AIN.DV":
MyO=CreateObject("AIN.DV")
L_ProgID_STR = COMCLASSINFO(MyO,1)
L_VersionIndependantProgID_STR = COMCLASSINFO(MyO,2)
L_Friendly_Name_STR = COMCLASSINFO(MyO,3)
L_CLSID_STR = COMCLASSINFO(MyO,4)
L_TYPE_OF_OBJECT_PASSED_STR = COMCLASSINFO(MyO,5)
Как видно из объекта можем найти CLSID: L_CLSID_STR = COMCLASSINFO(MyO,4)
Теперь по CLSID находим InprocServer32, который и есть путь. Путаница может возникнуть в 64 битных ОС, не так ли?

Local loWSH As wscript.Shell
loWSH = Createobject("wscript.shell")
L_PATH_TO_DLL_STR = loWSH.RegRead("HKEY_CLASSES_ROOT\CLSID\" + L_CLSID_STR + "\InProcServer32\")
L_ThreadingModel_STR = loWSH.RegRead("HKEY_CLASSES_ROOT\CLSID\" + L_CLSID_STR + "\InProcServer32\ThreadingModel")
RELEASE loWSH
MESSAGEBOX(L_PATH_TO_DLL_STR)
MESSAGEBOX(L_ThreadingModel_STR)
MyO = .NULL. && ликвидируем объект

Вопрос как использовать этот код в 64 битных ОС?
Когда и где мы должны вставлять Wow6432Node?

HKLM = HKEY_LOCAL_MACHINE



Исправлено 12 раз(а). Последнее : AdamAry, 23.03.17 09:54
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Спасибо.
Надеюсь зарегистрирована напрямую (хотя как узнать напрямую или нет: вручную и программно).
Так вот правильно?:
Какие подводные камни есть при использовании этих функций если не напрямую, если это 64 битная ОС, если это 32 битная dll в 64 bit OS?

Цитата:
В HKCR ищется ProgID - в нём в ветке CLSID значение по умолчанию (это и есть CLSID данного компонента). По этому значению ищется ветка в HKCR\CLSID\{....} - это собственно ветка описания установленного компонента. Далее в зависимости от типа ком-сервера в подветке InprocServer32, или LocalServer32 будет значение по умолчанию с путём к dll/ocx/exe файлу экспортирующему класс данного ком-сервера.
:
?DLL_PATH_FROM_PROGID("s.b")
FUNCTION DLL_PATH_FROM_PROGID(PAR_PROGID_STR)
LOCAL L_WSSH_OBJ As wscript.Shell
L_WSSH_OBJ = CreateObject("wscript.shell")
LOCAL L_CLSID_STR
L_CLSID_STR = CLSID_FROM_PROGID(PAR_PROGID_STR)
L_PATH_TO_DLL_STR = L_WSSH_OBJ.RegRead("HKEY_CLASSES_ROOT\CLSID\" + L_CLSID_STR + "\InProcServer32\")
L_ThreadingModel_STR = L_WSSH_OBJ.RegRead("HKEY_CLASSES_ROOT\CLSID\" + L_CLSID_STR + "\InProcServer32\ThreadingModel")
RELEASE loWSH
RETURN ALLTRIM(L_PATH_TO_DLL_STR)
ENDFUNC
&& ?CLSID_FROM_PROGID("s.b")
FUNCTION CLSID_FROM_PROGID(PAR_PROGID_STR)
*!* '--- Here's the registry path where we'll look up the CLSID which corresponds to the ProgID
LOCAL L_CLSID_PATH_STR, L_CLSID_STR
L_CLSID_PATH_STR = "HKEY_CLASSES_ROOT\" + PAR_PROGID_STR + "\CLSID\"
*!* '--- Create a WScript.Shell object
*!* Set oReg = WScript.CreateObject("WScript.Shell")
LOCAL L_WSSH_OBJ As wscript.Shell
L_WSSH_OBJ = CreateObject("wscript.shell")
*!* '--- Read the CLSID from the registry
*!* '--- If it doesn't exist, it will fail
*!* On Error Resume Next
*!* clsid = oReg.RegRead(clsidPath)
L_CLSID_STR = ALLTRIM(L_WSSH_OBJ.RegRead(L_CLSID_PATH_STR))
&& : L_CLSID_STR = COMCLASSINFO(MyO,4) && after MyO=CreateObject("s.b")
*!* If Err.Number <> 0 Then
*!* WScript.Echo "Error: Cannot open registry for speficied ProgID."
*!* WScript.Echo "Error: Please recheck your ProgID."
*!* WScript.Quit
*!* End If
RELEASE L_WSSH_OBJ
RETURN L_CLSID_STR
ENDFUNC



А как выяснить напрямую или нет?:
Цитата:
Смотря как она зарегистрирована в реестре... Если напрямую, без использования механизма Advertisement имеющегося в системе установки Windows Installer, то процесс поиска dll сравнительно несложен.



Исправлено 5 раз(а). Последнее : AdamAry, 23.03.17 14:39
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Спасибо.
Цитата:
Это ОЧЕНЬ непростая система - там и разные типы компонент, варианты активации, DCOM, потоковые модели, библиотеки типов, интерфейсы
А нет универсального подхода ко всем этим примочкам или нужно к каждому типу отдельный подход?
И где это описано?



Исправлено 2 раз(а). Последнее : AdamAry, 23.03.17 14:39
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AdamAry
Как видно из объекта можем найти CLSID
Да, только если компонент прописан в манифесте приложения а не в реестре, то толку от этого будет мало... Технология RegFreeCOM позволяет использовать com классы без их регистрации в реестре.
AdamAry
Вопрос как использовать этот код в 64 битных ОС?
Когда и где мы должны вставлять Wow6432Node?
Сразу же после HKEY_CLASSES_ROOT - если требуется на 64-разрядной ОС получить информацию о 32-разрядной компоненте.

Для advertized компонент по идее путь всё равно указывается - просто самой dll по этому путь может не быть... В реестре для них дополнительные "зашифрованные" значения прописаны - чтобы при обращении сработал установщик.


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Найти путь до dll от COM Server зная ProgID
AdamAry
Автор

Сообщений: 843
Дата регистрации: 14.12.2015
Igor Korolyov
Смотря как она зарегистрирована в реестре... Если напрямую, без использования механизма Advertisement имеющегося в системе установки Windows Installer, то процесс поиска dll сравнительно несложен.
Как выяснить?: напрямую или нет?:
1. Визуально
2. Программно
Ratings: 0 negative/0 positive
Re: Найти путь до dll от COM Server зная ProgID
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не в курсе, никогда такой нужды не испытывал Наверное по этому хитрому дополнительному ключу с "абракадаброй" и можно. Только не нужно это никогда


------------------
WBR, Igor
Ratings: 0 negative/1 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика