Вот возник вопрос, как узнать CLSID по имени Dll? То есть имеем к примеру "some.dll", а нужно узнать идентификатор класса этой Dll типа такого: {00020430-0000-0000-C000-000000000046} Пробовал так: CLSIDFromProgID("some.dll", clsid), где clsid - структура, в которую должен возвращаться уникальный для Dll CLSID. Но все поля структуры почемуто всегда 0.
допустим я зарегал ActiveX Dll так: regsvr32 -s some.dll теперь в реестре создался CLSID, прописанный в этой Dll и уникальный для нее... вот как этот clsid узнать. Узнать нужно для любой ActiveX Dll (даже если она удалена, но зарегистрирована в разделе CLSID реестра)
Вообще-то поиск СОМ'ов как раз на другое направление рассчитывался, т.е. по CLSID находить собственно COM-объект. Навскидку можно посоветовать перебрать ветвь HKEY_CLASSES_ROOT\CLSID. На каждый GUID смотреть параметр InprocServer32 (там путь и имя объекта, чаще всего .dll), пока не найдется искомый объект.
_BC_ Не, нужно ченить попроще. Например VB в файлх проекта пишет такую фигню: Reference=*\G{324B3E0A-3A50-4F79-841A-060219B191B0}#1.0#0#comctl.dll# Z_CommonControls При этом после компиляции в EXE есть только comctl.dll и Z_CommonControls, CLSID же чаще всего отсутствует. Для генерации исходной строчки нужно его восстановить зная только имя Dll и название класса (в данном примере Z_CommonControls) Вопрос в том как это сделать
GPcH почитай про регистрацию activex в любом туториале по activex там всегда описано где и как прописывается dll обрати эту процедуру и найдёшь искомое или хотя бы посмотри на тот ключ реестра , который упоминает _BC_- многое станет ясно
staier Да знаю я как парсингом реестра этот CLSID узнать, но медленно это работает... если EXE юзает штук 10 Dll таких, то определить CLSID всех займет около 10 секунд (программа пишется на VB, потому и секунд столько много) а это слишком медленно (если учесть что столько же времени декомпилятся около 100 пикодовых процедур), потому и ищу какой нибудь способ через API, чтобы мгновенно работало
GPcH А по-твоему, винда будет специально для тебя хранить в памяти список соответствий CLSID'ов объектам, проиндексированный по CLSID? В любом случае перебор ключей в реестре неизбежен, даже CLSIDFromProgID, которая возвращает CLSID, соответствующий данному ProgID, сводится к поиску в HKEY_CLASSES_ROOT.
GPcH убей себя , выпей йаду если ты пишешь на vb или закешируй всё это дело да и ищи себе на здоровье и будет тебе счастие
IMHO не нужно ничего сканировать в реестре. Как я понимаю, ты можешь вытащить ProgID COM класса из скомпилированного файла, а значит CLSID можно найти элементарно. На PowerBASIC`е все реализуется в несколько строчек. Заверни этот код в DLL и вызывай его из VB... Код (Text): #Compile Exe #Dim All #Include "Win32API.inc" Function WinMain (ByVal hInstance As Dword, _ ByVal hPrevInst As Dword, _ ByVal lpszCmdLine As Asciiz Ptr, _ ByVal nCmdShow As Long ) As Long Local ClassName As String Local CLSID_Name As Guid Local GUID_LIB As String ClassName= InputBox$("Input ProgID") If ClassName<>"" Then CLSID_Name= ClsId$(ClassName) GUID_LIB= GuidTxt$(CLSID_Name) MsgBox ClassName & " - " & GUID_LIB , %MB_OK,"CLSID" End If End Function _124092042__CLSID.zip