Цитата(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
|
Но, кажется, должен быть способ проще |