Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > CLSID из модуля класса


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

Автор: Rrader 30.12.2010, 15:00
Речь идет о неизвестной незарегистрированной ActiveX DLL? Классов может быть несколько, нужно использовать функции для работы с библиотекой типов. С их же помощью можно достать все DISPID для методов диспинтерфейсов.
http://msdn.microsoft.com/en-us/library/ms221172.aspx

Автор: Akina 30.12.2010, 15:14
Цитата

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 и т.п.

Автор: Cheloveck 30.12.2010, 16:25
Цитата(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

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

Автор: Rrader 30.12.2010, 17:12
CLSIDFromProgID попробуйте, а DISPID достать можно функциями поддержки TLB

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)