Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.52/64: Рейтинг темы: голосов - 64, средняя оценка - 4.52
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79

Вызов любых функций по указателю

17.04.2014, 19:11. Показов 13758. Ответов 57

Студворк — интернет-сервис помощи студентам
Пока не работал форум, ковырялся в рантайме VB .
Иследуя функции VBA6 придумал способ вызова функций по указателю.
Все просто. Объявляем прототип функции (пустую функцию), где дополнительно первым параметром будет передаваться адрес функции. Далее пропатчиваем его, таким образом чтобы он перекидывал нас по адресу заданному первым параметром. Таким образом можно вызывать функции в стандартных модулях, модулях класса, формы, API-функции (например полученные через LoadLibrary и GetProcAddress).
Одно замечание, пока не выяснил причину, желательно запускать проект через Ctrl+F5, т.к. иногда может не работать указатель или же вообще происходить вылет. А так работает и в IDE и в скомпилированном виде.

Пример вызова по указателю обычных функций модуля.
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Private Declare Function GetMem4 Lib "msvbvm60" (src As Any, dst As Any) As Long
Private Declare Function VirtualProtect Lib "kernel32" (ByVal lpAddress As Long, ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Sub EbGetExecutingProj Lib "vba6" (hProject As Long)
Private Declare Function TipGetFunctionId Lib "vba6" (ByVal hProj As Long, ByVal bstrName As Long, ByRef bstrId As Long) As Long
Private Declare Function TipGetLpfnOfFunctionId Lib "vba6" (ByVal hProject As Long, ByVal bstrId As Long, ByRef lpAddress As Long) As Long
Private Declare Sub SysFreeString Lib "oleaut32" (ByVal lpbstr As Long)
 
Private Const PAGE_EXECUTE_READWRITE = &H40
 
' Пример вызова функции по указатею
Public Sub Main()
 
    ' Пропатчиваем функции, перед первым вызовом
    PatchFunc "Proto1", AddressOf Proto1
    PatchFunc "Proto2", AddressOf Proto2
 
    MsgBox Proto1(AddressOf Func1, 1, "Вызов")
    MsgBox Proto1(AddressOf Func2, 2, "По указателю")
    MsgBox Proto1(AddressOf Func3, 3, ";)")
 
    Call Proto2(AddressOf Sub1)
    Call Proto2(AddressOf Sub2)
End Sub
 
' Прототип функций
Private Function Proto1(ByVal Addr As Long, ByVal x As Long, y As String) As String
End Function
Private Sub Proto2(ByVal Addr As Long)
End Sub
' Функции
Private Function Func1(ByVal x As Long, y As String) As String
    Func1 = "Func1_" & y
End Function
Private Function Func2(ByVal x As Long, y As String) As String
    Func2 = "Func2_" & y
End Function
Private Function Func3(ByVal x As Long, y As String) As String
    Func3 = "Func3_" & y
End Function
Private Sub Sub1()
    MsgBox "Sub1"
End Sub
Private Sub Sub2()
    MsgBox "Sub2"
End Sub
 
' Вспомогательные функции
Private Sub PatchFunc(FuncName As String, ByVal Addr As Long)
    Dim lpAddr As Long, hProj As Long, sId As Long, InIDE As Boolean
 
    Debug.Assert MakeTrue(InIDE)
 
    ' Получаем адрес функции
    If InIDE Then
        EbGetExecutingProj hProj
        TipGetFunctionId hProj, StrPtr(FuncName), sId
        TipGetLpfnOfFunctionId hProj, sId, lpAddr
        SysFreeString sId
    Else
        lpAddr = GetAddr(Addr)
        VirtualProtect lpAddr, 8, PAGE_EXECUTE_READWRITE, 0
    End If
 
    ' Записываем вставку
    ' Запускать только по Ctrl+F5!!
    ' pop eax
    ' pop ecx
    ' push eax
    ' jmp ecx
 
    GetMem4 &HFF505958, ByVal lpAddr
    GetMem4 &HE1, ByVal lpAddr + 4
End Sub
 
Private Function GetAddr(ByVal Addr As Long) As Long
    GetAddr = Addr
End Function
Public Function MakeTrue(ByRef bvar As Boolean) As Boolean
    bvar = True: MakeTrue = True
End Function

Вызов метода класса (как вычислить адреса напишу позже).
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
' Пример вызова метода по указатею
Public Sub Main()
    Dim lpFunc As Long, Obj As Class1, ret As Long
 
    Set Obj = New Class1
 
    GetMem4 ByVal ObjPtr(Obj), lpFunc
    GetMem4 ByVal lpFunc + &H1C, lpFunc
 
    PatchFunc "Class1_ZZZ", AddressOf Class1_ZZZ
 
    Call Class1_ZZZ(lpFunc, Obj, 123, 567, ret)
End Sub
 
' Прототип функций
Private Function Class1_ZZZ(ByVal Addr As Long, ByVal Obj As Class1, ByVal o As Long, ByVal b As Long, ret As Long) As Long
End Function
Класс:
Visual Basic
1
2
3
4
Public Function ZZZ(ByVal o As Long, ByVal b As Long) As Long
    MsgBox o & " " & b
    ZZZ = 5
End Function

Вызов API функций:
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' Пример вызова метода по указатею
Public Sub Main()
    Dim hUser As Long, hGDI As Long
    Dim DC As Long
 
    hUser = LoadLibrary("user32")
    hGDI = LoadLibrary("gdi32")
 
    PatchFunc "GetDC", AddressOf GetDC
    PatchFunc "ReleaseDC", AddressOf ReleaseDC
    PatchFunc "Ellipse", AddressOf Ellipse
 
    DC = GetDC(GetProcAddress(hUser, "GetDC"), 0)
    Ellipse GetProcAddress(hGDI, "Ellipse"), DC, 0, 0, 500, 500
    ReleaseDC GetProcAddress(hUser, "ReleaseDC"), 0, DC
End Sub
 
' Прототип функций
Private Function GetDC(ByVal Addr As Long, ByVal hWnd As Long) As Long
End Function
Private Function ReleaseDC(ByVal Addr As Long, ByVal hWnd As Long, ByVal hdc As Long) As Long
End Function
Private Function Ellipse(ByVal Addr As Long, ByVal hdc As Long, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
End Function
5
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.04.2014, 19:11
Ответы с готовыми решениями:

Вызов функций по указателю
Введение Как известно, прямой работы с указателями в VB нет. Однако есть функции для почти прямой работы с ними – частично скрытые...

Вызов функции по указателю с параметрами
Здравствуйте, видел пример как это можно сделать, но примеры не рабочие, либо я не так что - то делаю, как передать параметры и выполнить...

Вызов функции по указателю из класса
Такой расклад. Допустим имеем код: #include <iostream> using namespace std; template <class _Tp> class my_mem_fun_t { ...

57
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
19.04.2014, 00:48
Студворк — интернет-сервис помощи студентам
Полезная программа ...

молодец !
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
19.04.2014, 01:16
The trick,
Visual Basic
1
2
3
4
5
6
имеются 5 глобальных переменных:
Public lA As Long
Public sB As Single
Public iC As Integer
Public bD As Byte
Public sE As Double
а в чем разница Public переменных и Global? Если они обе вроде как глобальные... Public является публичной для данного приложения, а Global для доступа извне? Или я ошибаюсь? Поправь пожалуста...
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
19.04.2014, 01:25
это синонимы
тоесть два разных слова имеющие один смысл
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
19.04.2014, 09:11  [ТС]
Цитата Сообщение от Yury Komar Посмотреть сообщение
в чем разница Public переменных и Global?
Практически никакой, за исключением того что Global можно объявлять только в стандартных модулях.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
20.04.2014, 16:05
Цитата Сообщение от The trick Посмотреть сообщение
GetVar.zip
Спасибо за пример.
Но откуда мы берем смещение &H3010 от адреса процесса?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
20.04.2014, 17:27  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Но откуда мы берем смещение &H3010 от адреса процесса?
Его можно получить из отладочных символов если в опциях компилятора поставить Create symbolic debug info.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.04.2014, 03:53  [ТС]
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Как и обещал
Просмотр классов, интерфейсов, типов, перечислений, модулей, объединений для ocx, dll, tlb.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
Option Explicit
 
' Работа с ITypeLib, ITypeInfo VB6
' © Кривоус Анатолий Анатольевич (The trick), 2014
 
Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As Long
    lpstrCustomFilter As Long
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As Long
    nMaxFile As Long
    lpstrFileTitle As Long
    nMaxFileTitle As Long
    lpstrInitialDir As Long
    lpstrTitle As Long
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As Long
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As Long
End Type
 
Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Sub VariantCopy Lib "oleaut32.dll" (pvargDest As Any, pvargSrc As Any)
 
Private Const ControlSpacing = 5
 
Dim IID_IUnknown As UUID
Dim IID_IDispatch As UUID
Dim KeyIndex As Long
Dim lib As ITypeLib
 
Private Sub Form_Load()
    
    LoadLibrary "msvbvm60.dll"
    
    CLSIDFromString "{00000000-0000-0000-C000-000000000046}", IID_IUnknown
    CLSIDFromString "{00020400-0000-0000-C000-000000000046}", IID_IDispatch
 
End Sub
 
Private Function LoadLibrary(Path As String) As Boolean
    Dim typCnt      As Long, Idx            As Long, ptr        As Long, libHelp      As String, libDesc       As String, _
        libName     As String, libAttr      As TLIBATTR, inf    As ITypeInfo, typName As String, tmp           As String, _
        locLib      As ITypeLib
        
    On Error GoTo ErrorLoading
    ' Получаем указатель на интерфейс ITypeLib
    Set locLib = LoadTypeLibEx(Path, REGKIND_NONE)
    ' Получаем документацию для библиотеки
    locLib.GetDocumentation -1, libName, libDesc, 0, libHelp
    ' Получаем указатель на атрибуты библиотеки
    ptr = locLib.GetLibAttr
    ' Копируем данные
    CopyMemory libAttr, ByVal ptr, Len(libAttr)
    ' Освобождаем память
    locLib.ReleaseTLibAttr ptr
    ' Получаем количество типов в библиотеке
    typCnt = locLib.GetTypeInfoCount()
    lvwClasses.ListItems.Clear
    ' Получении информации о каждом типе
    For Idx = 0 To typCnt - 1
        Set inf = locLib.GetTypeInfo(Idx)
        inf.GetDocumentation -1, typName, vbNullString, 0, vbNullString
        lvwClasses.ListItems.Add , , typName, , locLib.GetTypeInfoType(Idx) + 1
    Next
    ' Установка статуса
    stbStatus.Panels("path").Text = Path
    stbStatus.Panels("name").Text = libName
    stbStatus.Panels("desc").Text = libDesc
    
    Set lib = locLib
    
    LoadLibrary = True
    Exit Function
ErrorLoading:
    
    MsgBox "'" & Err.Number & "' " & Err.Description, vbCritical
End Function
 
Private Sub Form_Resize()
    If Me.ScaleWidth < ControlSpacing * 3 + 230 Or Me.ScaleHeight < ControlSpacing * 2 + stbStatus.Height Then Exit Sub
    lvwClasses.Move ControlSpacing, ControlSpacing, 230, Me.ScaleHeight - ControlSpacing * 2 - stbStatus.Height
    tvwMembers.Move lvwClasses.Left + lvwClasses.Width + ControlSpacing, ControlSpacing, _
                    Me.ScaleWidth - lvwClasses.Width - ControlSpacing * 3, lvwClasses.Height
End Sub
 
Private Sub lvwClasses_ItemClick(ByVal Item As ComctlLib.ListItem)
    KeyIndex = 0
    tvwMembers.Nodes.Clear
    GetMembersInfo lib.GetTypeInfo(Item.Index - 1), vbNullString
End Sub
 
Private Function GetMembersInfo(inf As ITypeInfo, KeyNode As String) As Boolean
    Dim hType       As Long, Idx        As Long, ptr        As Long, typAttr        As TYPEATTR, fncInfo        As FUNCDESC, _
        itmName     As String, varInfo  As VARDESC, icn     As Long, itmHelp        As String, IName            As String, _
        locKey      As String, arrDesc  As ARRAYDESC, sa()  As SAFEARRAYBOUND, cnst As Variant, tmp             As Long
    ' Получаем атрибуты
    ptr = inf.GetTypeAttr()
    CopyMemory typAttr, ByVal ptr, Len(typAttr)
    inf.ReleaseTypeAttr ptr
    ' Если это кокласс, интерфейс
    If typAttr.TYPEKIND = TKIND_INTERFACE Or _
       typAttr.TYPEKIND = TKIND_COCLASS Or _
       typAttr.TYPEKIND = TKIND_DISPATCH Then
       ' Информация о реализуемых интерфейсах
        If typAttr.TYPEKIND <> TKIND_COCLASS Then
            ' Если это не кокласс то добавляем в список интерфейс
            ' Получаем имя интерфейса
            IName = GetInterfaceName(typAttr.iid)
            ' Создаем родительский ключ для производных интерфейсов
            locKey = "m_" & CStr(KeyIndex)
            ' Добавляем в дерево
            If Len(KeyNode) Then
                tvwMembers.Nodes.Add(KeyNode, tvwChild, locKey, IName, 4).Expanded = True
            Else
                tvwMembers.Nodes.Add(, , locKey, IName, 4).Expanded = True
            End If
            ' Следующий элемент дерева
            KeyIndex = KeyIndex + 1
        End If
        ' Проходим по списку реализуемых интерфейсов
        On Error GoTo ErrDll
        For Idx = 0 To typAttr.cImplTypes - 1
            hType = inf.GetRefTypeOfImplType(Idx)
            ' Добавляем их в дочерний узел
            GetMembersInfo inf.GetRefTypeInfo(hType), locKey
ErrDll:
        Next
        ' Получение информации о методах
        For Idx = 0 To typAttr.cFuncs - 1
            ' Получаем описание метода
            ptr = inf.GetFuncDesc(Idx)
            CopyMemory fncInfo, ByVal ptr, Len(fncInfo)
            inf.ReleaseFuncDesc ptr
            ' Получаем имя и описание метода
            inf.GetDocumentation fncInfo.memid, itmName, itmHelp, 0, vbNullString
            ' Получаем тип метода и устанавливаем соответствующую иконку
            Select Case fncInfo.invkind
            Case INVOKEKIND.INVOKE_FUNC: icn = 2
            Case INVOKEKIND.INVOKE_PROPERTYGET: icn = 5
            Case Else: icn = 6
            End Select
            ' Добавляем в список
            tvwMembers.Nodes.Add(locKey, tvwChild, "m_" & CStr(KeyIndex), itmName, icn).Tag = itmHelp
            ' Следующий элемент дерева
            KeyIndex = KeyIndex + 1
        Next
    Else
        ' Если псевдоним
        If typAttr.TYPEKIND = TKIND_ALIAS Then
            ' Получаем тип переменной
            Do
                Select Case typAttr.tdescAlias.vt
                Case VARENUM.VT_USERDEFINED
                    ' Если псевдоним UDT
                    GetMembersInfo inf.GetRefTypeInfo(typAttr.tdescAlias.pTypeDesc), KeyNode
                    Exit Do
                Case VARENUM.VT_PTR
                    ' Если это ссылка, то получаем содержимое
                    CopyMemory typAttr.tdescAlias, ByVal typAttr.tdescAlias.pTypeDesc, Len(typAttr.tdescAlias)
                Case VARENUM.VT_CARRAY
                    ' Это массив
                    CopyMemory arrDesc, ByVal typAttr.tdescAlias.pTypeDesc, Len(arrDesc)
                    typAttr.tdescAlias = arrDesc.tdescElem
                Case Else
                    icn = 10
                    ' Это стандартный тип
                    itmName = Switch(typAttr.tdescAlias.vt = VARENUM.VT_BOOL, "Boolean", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_BSTR, "String", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_CARRAY, "CArray", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_CY, "Currency", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_DATE, "Date", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_DECIMAL, "Decimal", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_DISPATCH, "IDispatch", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_ERROR, "SCODE", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_I1, "Char", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_I2, "Integer", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_I4, "Long", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_I8, "Int64", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_INT, "Int", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_LPSTR, "lpStr", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_LPWSTR, "lpwStr", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_R4, "Single", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_R8, "Double", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_SAFEARRAY, "Array", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_UI1, "Byte", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_UI2, "UShort", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_UI4, "ULong", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_UI8, "UInt64", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_UINT, "UInt", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_UNKNOWN, "IUnknown", _
                                     typAttr.tdescAlias.vt = VARENUM.VT_VARIANT, "Variant")
                    ' Добавляем в список
                    If Len(KeyNode) Then
                        tvwMembers.Nodes.Add KeyNode, tvwChild, locKey, itmName, icn
                    Else
                        tvwMembers.Nodes.Add , , locKey, itmName, icn
                    End If
                    Exit Do
                End Select
            Loop
        Else
        ' Если не псевдоним
            'Проходим по списку элементов переменных, констант
            For Idx = 0 To typAttr.cVars - 1
                ' Получаем описание
                ptr = inf.GetVarDesc(Idx)
                CopyMemory varInfo, ByVal ptr, Len(varInfo)
                ' Получаем имя, описание
                inf.GetDocumentation varInfo.memid, itmName, itmHelp, 0, vbNullString
                ' Получаем тип элемента и устанавливаем иконку
                Select Case varInfo.VARKIND
                Case VARKIND.VAR_CONST
                    icn = 1
                    VariantCopy cnst, ByVal varInfo.oInst_varValue
                    itmName = itmName & " = " & cnst & " (&H" & Hex(cnst) & ")"
                Case VARKIND.VAR_PERINSTANCE
                    If typAttr.TYPEKIND = TKIND_ENUM Then
                        icn = 1
                        VariantCopy cnst, ByVal varInfo.oInst_varValue
                        itmName = itmName & " = " & cnst & " (&H" & Hex(cnst) & ")"
                    Else
                        icn = 10
                    End If
                Case Else: icn = 0
                End Select
                ' Добавляем в список
                If Len(KeyNode) Then
                    tvwMembers.Nodes.Add(KeyNode, tvwChild, locKey, itmName, icn).Tag = itmHelp
                Else
                    tvwMembers.Nodes.Add(, , locKey, itmName, icn).Tag = itmHelp
                End If
                ' Следующий элемент дерева
                KeyIndex = KeyIndex + 1
                inf.ReleaseVarDesc ptr
            Next
            ' Проход по списку функций
            For Idx = 0 To typAttr.cFuncs - 1
                ' Получаем описание
                ptr = inf.GetFuncDesc(Idx)
                CopyMemory fncInfo, ByVal ptr, Len(fncInfo)
                inf.ReleaseFuncDesc ptr
                ' Получаем имя, описание
                inf.GetDocumentation fncInfo.memid, itmName, itmHelp, 0, vbNullString
                ' Добавляем в список
                If Len(KeyNode) Then
                    tvwMembers.Nodes.Add(KeyNode, tvwChild, locKey, itmName, 2).Tag = itmHelp
                Else
                    tvwMembers.Nodes.Add(, , locKey, itmName, 2).Tag = itmHelp
                End If
                ' Следующий элемент дерева
                KeyIndex = KeyIndex + 1
            Next
        End If
    End If
    
End Function
' Получить имя интерфейса
Private Function GetInterfaceName(guid As UUID) As String
    Dim inf     As ITypeInfo, i     As Long
    
    On Error GoTo ErrUnkInterface
    
    Select Case True
    Case IsEqualGUID(guid, IID_IUnknown)
        GetInterfaceName = "IUnknown"
    Case IsEqualGUID(guid, IID_IDispatch)
        GetInterfaceName = "IDispatch"
    Case Else
        Set inf = lib.GetTypeInfoOfIID(guid)
        inf.GetDocumentation -1, GetInterfaceName, vbNullString, 0, vbNullString
    End Select
    
    Exit Function
ErrUnkInterface:
    GetInterfaceName = "ERROR"
    'S1 = Space(255)
    'i = StringFromGUID2(guid, StrPtr(S1), Len(S1))
    'S1 = Left(S1, i)
End Function
 
Private Sub mnuOpen_Click()
    Dim ofn     As OPENFILENAME, Out    As String, i        As Long
    
    ofn.nMaxFile = 260
    Out = String(260, vbNullChar)
 
    ofn.hwndOwner = hWnd
    ofn.lpstrTitle = StrPtr("Открыть файл")
    ofn.lpstrFile = StrPtr(Out)
    ofn.lStructSize = Len(ofn)
    ofn.lpstrFilter = StrPtr("Поддерживаемые файлы" & vbNullChar & "*.dll;*.ocx;*.tlb" & vbNullChar)
    
    If GetOpenFileName(ofn) Then
        i = InStr(1, Out, vbNullChar, vbBinaryCompare)
        If i Then Out = Left$(Out, i - 1)
        LoadLibrary Out
    End If
End Sub
 
Private Sub mnuQuit_Click()
    Unload Me
End Sub
 
Private Sub tvwMembers_NodeClick(ByVal Node As ComctlLib.Node)
    stbStatus.Panels("help").Text = Node.Tag
End Sub
Миниатюры
Вызов любых функций по указателю  
Вложения
Тип файла: rar DllInfo.rar (177.9 Кб, 49 просмотров)
2
Модератор
Эксперт .NET
 Аватар для Yury Komar
4357 / 3427 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
25.04.2014, 11:58
The trick, круто!
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 15:45
Цитата Сообщение от The trick Посмотреть сообщение
Как и обещал
Просмотр классов, интерфейсов, типов, перечислений, модулей, объединений для ocx, dll, tlb.
Спасибо тебе огромное !


Добавлено через 1 минуту
Теперь обязательно включу в свою работу !

Добавлено через 14 минут
Эксешник работает, его уже в принципе можно использовать как отдельное приложение
но вот проект не запускается ругань на это ...
Visual Basic
1
Private Sub lvwClasses_ItemClick(ByVal Item As ComctlLib.ListItem)
а конкретнее на это .. ComctlLib.ListItem
как она правильно называеться чтоб ее подключить через браузер компонентов ?
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.04.2014, 15:47  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
ComctlLib.ListItem
Странно. Убери везде ComctlLib. оставь просто ListItem и Node
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 15:59
сейчас постараюсь сам разобраться ...
я тебе лог скину в личку ...

Добавлено через 3 минуты
Вобщем пишет что и сам компонент ошибочен...
который рассположен на форме попробую его подменить
и переименовать под твой
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.04.2014, 16:01  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
может зарегестрировать которые в твоей папке ?
Регистрировать не нужно, подключи в референсы.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 16:03
Что-то у тебя с компонентами не то.
В компонентах должно быть подключено Microsoft Windows Common Controls 5.0 (comctl32.ocx)
Возможно я ведь винду переустанавливал, сейчас постараюсь отыскать
его в сохраненной копии старой винды...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.04.2014, 16:05  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Возможно я ведь винду переустанавливал, сейчас постараюсь отыскать
его в сохраненной копии старой винды...
Проект не забудь только заново скачать и открыть. По идее все должно работать, т.к. EXE Работает.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 16:07
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Microsoft Windows Common Controls 5.0
такой есть !
теперь ругается на эту строчку ..
Dim IID_IUnknown As UUID
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
25.04.2014, 16:08  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Dim IID_IUnknown As UUID
Подключи в референсы там тлб в папке с проектом
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 16:28
Проект работает ! ✰


Добавлено через 1 минуту
Я заново пере-извлек из архива и сразу подключил
Microsoft Windows Common Controls 5.0
и перезапустил .

Добавлено через 3 минуты
наверное тебе не надо было его указывать в проекте явно ...
а создавать на месте .. в инициализации (ну это только совет)

Добавлено через 4 минуты
Анатолий ! Спасибо тебе за твой труд !

Добавлено через 6 минут
Пойду стучаться к модераторам чтоб они тебе поставили это лучшим ответом !
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 21:31
Теперь я берегу этот архив как ценный бриллиант
но дело еще вот а чем....
почему не отображаются аргументы в функциях и свойствах
если и такое можно будет сделать то вообще можно отказаться от среды IDE
или сделать её посредником своей среды разоаботки
Миниатюры
Вызов любых функций по указателю   Вызов любых функций по указателю  
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
25.04.2014, 22:13
Тоже как-то с первого раза не получилось.
Распаковал заново. Скопировал в папку с проектом файл c:\Windows\SysWOW64\COMCTL32.OCX
Указал в References и переоткрыл проект. Все запустилось.

Спасибо, The trick, шикарно показывает.
Скажи, пожалуйста, ошибка "error loading dll" (Err = 48), здесь:
Visual Basic
Set locLib = LoadTypeLibEx(Path, REGKIND_NONE)
например с zipfldr.dll означает, что у нее нет доступных интерфейсов?

Можно ли доработать программу, чтобы вначале списка еще и показывала список импортируемых/экспортируемых API?
Было бы вообще замечательно.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
25.04.2014, 22:42
Тоесть если все будет доработанно то я постараюсь сделать
к твоему проекту хорошую рецензию, отпишу во всех подробностях
зачем нужна эта программа и что она умеет делать,
а Dragokas разместит в закрепленной теме (..может быть)
у нас этот продукт потом даже иностранцы будут скачивать ... )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.04.2014, 22:42
Помогаю со студенческими работами здесь

Вызов виртуальной функции по указателю
Суть в том, что преподаватель дал задание на защиту курсовой: вызов по указателю виртуальной функции из ТВР, искал в интернете, наткнулся...

Вызов функции по указателю со смещением
Добрый день. Есть dll открытая декомпилятором. В ней есть интересующая меня функция, но она вызываться по указателю со смещением: if (...

вызов конструктора, по указателю на объект
class qwe { public: qwe() {} qwe(char * name, int a, int b):_name(strdup(name)), _a(a), _b(b) {} private: char * _name; ...

Вызов функции по указателю, расположенному в структуре
Господа, помогите с синтаксисом: не могу понять как мне вызвать функцию по указателю, расположенному внутри структуры. Вся эта писанина...

Вызов виртуальной функции по нулевому указателю
struct A { int sum1(int a, int b) { return a+b; } virtual int sum2(int a, int b) { return a+b; } }; int main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru