Как узнать CLSID по имени Dll?

Тема в разделе "WASM.ZEN", создана пользователем GPcH, 11 авг 2005.

  1. GPcH

    GPcH Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    136
    Вот возник вопрос, как узнать CLSID по имени Dll?

    То есть имеем к примеру "some.dll", а нужно узнать идентификатор класса этой Dll типа такого: {00020430-0000-0000-C000-000000000046}



    Пробовал так:



    CLSIDFromProgID("some.dll", clsid),



    где clsid - структура, в которую должен возвращаться уникальный для Dll CLSID. Но все поля структуры почемуто всегда 0.
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    А .dll тута не причём :) вот вызов

    CLSIDFromProgID("Excel.Application", clsid)
     
  3. GPcH

    GPcH Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    136
    А как узнать CLSID ИМЕННО Dll? Есть способ?
     
  4. GPcH

    GPcH Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    136
    допустим я зарегал ActiveX Dll так: regsvr32 -s some.dll

    теперь в реестре создался CLSID, прописанный в этой Dll и уникальный для нее... вот как этот clsid узнать. Узнать нужно для любой ActiveX Dll (даже если она удалена, но зарегистрирована в разделе CLSID реестра)
     
  5. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Вообще-то поиск СОМ'ов как раз на другое направление рассчитывался, т.е. по CLSID находить собственно COM-объект.

    Навскидку можно посоветовать перебрать ветвь HKEY_CLASSES_ROOT\CLSID. На каждый GUID смотреть параметр InprocServer32 (там путь и имя объекта, чаще всего .dll), пока не найдется искомый объект.
     
  6. GPcH

    GPcH Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    136
    _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)



    Вопрос в том как это сделать
     
  7. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    GPcH

    почитай про регистрацию activex в любом туториале по activex

    там всегда описано где и как прописывается dll



    обрати эту процедуру и найдёшь искомое

    или хотя бы посмотри на тот ключ реестра , который упоминает _BC_- многое станет ясно
     
  8. GPcH

    GPcH Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    136
    staier

    Да знаю я как парсингом реестра этот CLSID узнать, но медленно это работает... если EXE юзает штук 10 Dll таких, то определить CLSID всех займет около 10 секунд (программа пишется на VB, потому и секунд столько много) а это слишком медленно (если учесть что столько же времени декомпилятся около 100 пикодовых процедур), потому и ищу какой нибудь способ через API, чтобы мгновенно работало
     
  9. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    GPcH



    А по-твоему, винда будет специально для тебя хранить в памяти список соответствий CLSID'ов объектам, проиндексированный по CLSID?

    В любом случае перебор ключей в реестре неизбежен, даже CLSIDFromProgID, которая возвращает CLSID, соответствующий данному ProgID, сводится к поиску в HKEY_CLASSES_ROOT.
     
  10. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    GPcH

    убей себя , выпей йаду если ты пишешь на vb :derisive:

    или

    закешируй всё это дело да и ищи себе на здоровье

    и будет тебе счастие
     
  11. Swing

    Swing New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    25
    IMHO не нужно ничего сканировать в реестре. Как я понимаю, ты можешь вытащить ProgID COM класса из скомпилированного файла, а значит CLSID можно найти элементарно.

    На PowerBASIC`е все реализуется в несколько строчек. Заверни этот код в DLL и вызывай его из VB...


    Код (Text):
    1. #Compile Exe
    2. #Dim All
    3. #Include "Win32API.inc"
    4.  
    5. Function WinMain (ByVal  hInstance   As Dword, _
    6.                   ByVal  hPrevInst   As Dword, _
    7.                   ByVal  lpszCmdLine As Asciiz Ptr, _
    8.                   ByVal  nCmdShow    As Long ) As Long
    9.  
    10. Local ClassName   As String
    11. Local CLSID_Name  As Guid
    12. Local GUID_LIB    As String
    13.  
    14.       ClassName= InputBox$("Input ProgID")
    15.         If ClassName<>"" Then
    16.           CLSID_Name= ClsId$(ClassName)
    17.             GUID_LIB= GuidTxt$(CLSID_Name)
    18.               MsgBox  ClassName & " - " & GUID_LIB , %MB_OK,"CLSID"
    19.       End If
    20.      
    21. End Function








    [​IMG] _124092042__CLSID.zip