Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CLSID из модуля класса 
V
    Опции темы
Cheloveck
Дата 30.12.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Если я создаю ActiveX DLL проект, то могу ли я из программы узнать CLSID экспонируемого coclass'а?
Ещё попутно, но не так важно, могу ли я узнать DISPID методов интерфейса?

Это сообщение отредактировал(а) Cheloveck - 30.12.2010, 14:07


--------------------
user posted image
PM Jabber   Вверх
Rrader
  Дата 30.12.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 6
Всего: 191



Речь идет о неизвестной незарегистрированной ActiveX DLL? Классов может быть несколько, нужно использовать функции для работы с библиотекой типов. С их же помощью можно достать все DISPID для методов диспинтерфейсов.
Документация


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Akina
Дата 30.12.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата

A Universally Unique Identifier (UUID) is an identifier standard that provides a unique 128-bit (16 byte) value used to identify objects. The Globally Unique Identifier (GUID) is a Microsoft implementation of the UUID standard. To generate a UUID for your class, run the utility Guidgen.exe.

См. RFC 4122 и т.п.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Cheloveck
Дата 30.12.2010, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: нет
Всего: 32



Цитата(Rrader @  30.12.2010,  15:00 Найти цитируемый пост)
Речь идет о неизвестной незарегистрированной ActiveX DLL? 

Нет, речь идёт о DLL, которую VB сам и генерирует.
То есть, мы имеем модуль
Код

VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
  Persistable = 0  'NotPersistable
  DataBindingBehavior = 0  'vbNone
  DataSourceBehavior  = 0  'vbNone
  MTSTransactionMode  = 0  'NotAnMTSObject
END
Attribute VB_Name = "Class1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = True
Attribute VB_PredeclaredId = False
Attribute VB_Exposed = True
Public Function FooBar(param As Long) As Long
    FooBar = param + 10
End Function

И на выходе мы имеем dll примерно с такой вот TLB
Код

// Generated .IDL/C++ pseudo source equivalent of Win32 type library ..\<Unknown>
[
  uuid({B5729A09-E366-40F1-994C-B97D48A47815}),
  version(30.0)
]
library Project1
{
    // Forward references and typedefs
    dispinterface _Class1;

    [
      uuid({8F64F270-1831-4393-A619-EB9299976932}),
      version(1.0)
    ]
    dispinterface _Class1
    {
        properties:
        methods:
            [id(0), restricted] void QueryInterface(
                            [in] GUID* riid, 
                            [out] void** ppvObj);
            [id(1), restricted] unsigned long AddRef();
            [id(2), restricted] unsigned long Release();
            [id(3), restricted] void GetTypeInfoCount([out] unsigned int* pctinfo);
            [id(4), restricted] void GetTypeInfo(
                            [in] unsigned int itinfo, 
                            [in] unsigned long lcid, 
                            [out] void** pptinfo);
            [id(5), restricted] void GetIDsOfNames(
                            [in] GUID* riid, 
                            [in] char** rgszNames, 
                            [in] unsigned int cNames, 
                            [in] unsigned long lcid, 
                            [out] long* rgdispid);
            [id(6), restricted] void Invoke(
                            [in] long dispidMember, 
                            [in] GUID* riid, 
                            [in] unsigned long lcid, 
                            [in] unsigned short wFlags, 
                            [in] DISPPARAMS* pdispparams, 
                            [out] VARIANT* pvarResult, 
                            [out] EXCEPINFO* pexcepinfo, 
                            [out] unsigned int* puArgErr);
            [id(7)] long FooBar([in, out] long* param);
    };

    [
      uuid({4C1108C7-BFF4-44A7-89BA-8BCA7872ACD9}),
      version(1.0)
    ]
    coclass Class1
    {
        [default] dispinterface _Class1;
    };
};

{4C1108C7-BFF4-44A7-89BA-8BCA7872ACD9} - мне надо получить. Ну, а DISPID - это который
Код

  [id(7)] long FooBar([in, out] long* param);

то есть 7.

Пока сделал так
Код

Public Declare Function RegOpenKey Lib "advapi32.dll" _
    Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, _
    phkResult As Long) As Long
Public Declare Function RegQueryValue Lib "advapi32.dll" _
    Alias "RegQueryValueA" (ByVal hKey As Long, ByVal lpSubKey As String, _
    ByVal lpValue As String, lpcbValue As Long) As Long
    
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long

Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const ERROR_SUCCESS = 0&

Public Function ClsidFromClassName(classname As String) As String
    Dim key As Long
    Dim value As String
    Dim value_count As Long
    Dim result As Long
    value = Space(255)
    value_count = 255

    result = RegOpenKey(HKEY_CLASSES_ROOT, App.EXEName + "." + classname, key)
    If result = ERROR_SUCCESS Then
        result = RegQueryValue(key, "Clsid", ByVal value, value_count)
        RegCloseKey key
        If result = ERROR_SUCCESS Then
            ClsidFromClassName = value
        End If
    End If
End Function

Но, кажется, должен быть способ проще

Это сообщение отредактировал(а) Cheloveck - 30.12.2010, 16:30


--------------------
user posted image
PM Jabber   Вверх
Rrader
  Дата 30.12.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 6
Всего: 191



CLSIDFromProgID попробуйте, а DISPID достать можно функциями поддержки TLB


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.1220 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.