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

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

17.04.2014, 19:11. Показов 13454. Ответов 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
17.04.2014, 20:11
да, AddressOf в классе не работает
Цитата Сообщение от The trick Посмотреть сообщение
(как вычислить адреса напишу позже).
я тоже подумал что их както надо вычислять
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
17.04.2014, 21:39  [ТС]
Насчет получения адреса функций в классах.
Как известно каждый VB-шный класс реализует интерфейс IDispatch, что позволяет любой объект присвоить к типу Object, и вызывать методы по имени (например в CreateObject). Чтобы получить интерфейс в VB есть функция ObjPtr, которая возвращает указатель на данные объекта, первым Long'ом в котором идет указатель на VTable объекта; по этому смещению можно получить много чео интересного (пиватные переменные, количество ссылок и т.п). Итак, мы имеем указатель на VTable, сама vTable представляет собой список адресов методов поддерживаемыми экземпляром класса. Т.е. имея 2 разных объекта одного класса, указатель на vTable будет один и тот же. Т.к. каждый класс реализует IDispatch, а IDispatch наследует IUnknown (любой COM объект вообще) то смотрим в MSDN список методов IDispatch и IUnknown, соответственно 4 и 3. Получается что наши методы начнутся после них, получается 28 (&H1C) байт смещение в vTable содержит адрес первого метода (считаем сверху как описано в классе), + 4 - следующего и т.д. В ходе реверс-инжиниринга я обнаружил что после всех публичных методов идут приватные (так же сверху), Class_initialize, Class_terminate считаем также приватными методами (можно вызывать их повторно для переинициализации данных).
Но просто так нельзя вызвать метод, т.к. если мы обращаемся к приватным данным из кода класса, как узнать изнутри метода их расположение? Для этого при любом вызове метода из vTable первым параметром передается указатель на объект (ObjPtr). Это дает очень много воможностей, но я не буду их описывать. Так же каждый метод (исходя из COM) должен возвращать значение HRESULT, что обеспечивает контроль правильного вызова метода. В VB конечно для нас это недоступно, все функции (процедуры) в классах работают так как мы захотим и возвращают то, что нам надо. В реальности каждый метод возвращает HRESULT как и положено (т.к. к примеру мы можем делать ActiveX DLL которая является COM библиотекой и работает в любых программах написанных на других языах), а возвращаемы параметр описаный в функции, в реальности передается последним.
Фактически метод:
Visual Basic
1
Public Method (Byval X as long) as String
Превращается в:
Visual Basic
1
Public Method (ByVal ObjPtr as Class, Byval X as long, Ret as String) as Long
Все! Если кому интересно, могу написать как расчитать адрес метода в классе наследующим произвольный интерфейс.

Добавлено через 12 минут
Вот еще пример с классами:
Модуль:
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
' Ïðèìåð âûçîâà ìåòîäà ïî óêàçàòåþ
Public Sub Main()
    Dim vTbl As Long, lpMeth() As Long, Obj As Class, ret As Long, i As Long
    Set Obj = New Class
    
    GetMem4 ByVal ObjPtr(Obj), vTbl
    
    ReDim lpMeth(2)
    
    For i = 0 To 2
        GetMem4 ByVal vTbl + &H1C + i * 4, lpMeth(i) ' Ïîëó÷àåì àäðåc
    Next
    
    PatchFunc "Class_LetValue", AddressOf Class_LetValue
    PatchFunc "Class_GetValue", AddressOf Class_GetValue
    PatchFunc "Class_Initialize", AddressOf Class_Initialize
    
    Call Class_LetValue(lpMeth(0), Obj, 12345)  ' Âûçûâàåì Value (Let(12345))
    Call Class_GetValue(lpMeth(1), Obj, ret)    ' Âûçûâàåì Value (Get)
    Debug.Print ret
    Call Class_Initialize(lpMeth(2), Obj)       ' Âûçûâàåì Class_Initialize ;)
End Sub
 
' Ïðîòîòèï ôóíêöèé
Private Function Class_LetValue(ByVal Addr As Long, ByVal Obj As Class, _
                ByVal L As Long) As Long
End Function
Private Function Class_GetValue(ByVal Addr As Long, ByVal Obj As Class, _
                ret As Long) As Long
End Function
Private Function Class_Initialize(ByVal Addr As Long, ByVal Obj As Class) As Long
End Function
Класс (Class):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim mValue As Long
 
Private Sub Class_Initialize()
    mValue = 6
End Sub
 
Public Property Let Value(ByVal v As Long)
    mValue = v
End Property
Public Property Get Value() As Long
    Value = mValue
End Property
4
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
17.04.2014, 21:44
Цитата Сообщение от The trick Посмотреть сообщение
как расчитать адрес метода в классе наследующим произвольный интерфейс.
ну ты даёш ! (стране угля...)
конечно будет интересно я так думаю ... я как-раз к подобным трюкам
уже подбираюсь, но пока только подбираюсь, и вероятно столкнусь с таким вопросом
спасибо за разъяснения !

Добавлено через 2 минуты
а пока на всякий случай, сохраню страницу у себя
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
17.04.2014, 21:57  [ТС]
Кстати в модуле формы (обычной), смещение пользовательских функций начинается с &H6F8 байт от начала vTable. Вот пример вызова Form_Load по указателю.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
' Ïðèìåð âûçîâà ìåòîäà ïî óêàçàòåþ
Public Sub Main()
    Dim vTbl As Long, lpMeth As Long
    
    Form1.Show
    
    GetMem4 ByVal ObjPtr(Form1), vTbl
    GetMem4 ByVal vTbl + &H6F8, lpMeth   ' Ïîëó÷àåì àäðåc
    
    PatchFunc "Form_Load", AddressOf Form_Load
    
    Call Form_Load(lpMeth, Form1)
End Sub
3
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
17.04.2014, 22:24
Цитата Сообщение от The trick Посмотреть сообщение
Пока не работал форум, ковырялся в рантайме VB
Цитата Сообщение от The trick Посмотреть сообщение
Пример вызова метода по указатею

Не по теме:


я вообще зашел на эту страницу из любопытства,
...подумал неужели The Trick ! еще и о чем-то спрашивает :)
тебе-бы запостить это гденибудь в закрепленных темах


Я какнибудь доберусь и сделаю с помощъю Exel-я справку
с указаниями самых лучших ответов по бейсику этого форума
и выложу лист в блоге, уверен там будут ссылки только на
твои посты

а пока я просто ставлю оценки темам чтоб хоть как-то ориентироваться в лучших

1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
17.04.2014, 23:03  [ТС]
Вот еще недокументированные возможности (получение любых приватных, публичных переменных в экземпляре класса).
Модуль.
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
Public Sub Main()
    Dim Q As Class, tmp As Long, RefCount As Long
    Dim z1 As Long
    Dim z2 As Long
    Dim v1 As Long
    Dim v2 As Long
    Dim x1 As Long
    Dim x2 As Long
    Dim j1 As Long
    Dim j2 As Long
    Dim b1 As Long
    Dim b2 As Long
    
    Set Q = New Class
 
    GetMem4 ByVal ObjPtr(Q) + 8, tmp
    GetMem4 ByVal tmp + 4, RefCount     ' Ïîëó÷àåì êîëè÷åñòâî ññûëîê
    
    ' Ïîëó÷àåì âñå ïåðåìåííûå îáúåêòà (ñìåùåíèå &H34)
    ' ñíà÷àëà èäóò ïóáëè÷íûå ïî ìåðå èõ îïèñàíèÿ
    ' çàòåì ïðèâàòíûå
    ' Ïåðåìåííûå âûðàâíèâàòñÿ ïî ãðàíèöå 2-ãî ñëîâà (Byte, integer çàíèìàþò 4 áàéòà)
 
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H0, v1
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H4, v2
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H8, j1
    GetMem4 ByVal ObjPtr(Q) + &H34 + &HC, j2
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H10, z1
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H14, z2
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H18, x1
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H1C, x2
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H20, b1
    GetMem4 ByVal ObjPtr(Q) + &H34 + &H24, b2
 
End Sub
Класс.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim z1 As Long
Dim z2 As Long
Public v1 As Long
Public v2 As Long
Dim x1 As Long
Dim x2 As Long
Public j1 As Long
Public j2 As Long
Private b1 As Long
Private b2 As Long
 
Private Sub Class_Initialize()
    z1 = 1: z2 = 2: v1 = 3: v2 = 4: x1 = 5: x2 = 6: j1 = 7: j2 = 8: b1 = 9: b2 = &HA
End Sub
3
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
17.04.2014, 23:21
Цитата Сообщение от The trick Посмотреть сообщение
получение любых приватных, публичных переменных в экземпляре класса
а с помощью этого можно решить эту задачу ?

и вообще очевидно у меня встанет такой вопрос
если я буду пользовать объекты этим способом
Visual Basic
1
2
3
4
Option Explicit
 
Dim WithEvents Component As VBControlExtender
Event ObjectEvent(Info As EventInfo)
надо будет знать о переменных однозначно !

Добавлено через 3 минуты
Цитата Сообщение от The trick Посмотреть сообщение
GetMem4
я уж уже молчу что в моём мененжере WinApi вообще многова нет
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
18.04.2014, 00:11  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а с помощью этого можно решить эту задачу ?
Решение той задачи - декларация в tlb, либо смена типа проекта. Смысл получения только под отладкой?

Добавлено через 58 секунд
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
надо будет знать о переменных однозначно !
Все описанное относится только к VB классам (по нахождению переменных).
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.04.2014, 00:21
Цитата Сообщение от The trick Посмотреть сообщение
только к VB класса
а переменные OCX можно увидеть ?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
18.04.2014, 00:22  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
а переменные OCX можно увидеть ?
OCX пишут не только на VB6. Зачем ты хочешь определить переменные ActiveX контрола? Может есть другой способ, нужно знать причину.
0
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.04.2014, 17:22
затем чтобы видеть перечисления Enum так как они были записанны
другие переменные мне не нужны, они отображаються
а вообще я сейчас делаю программу, которая генерирует документацию
к любому компоненту, но в ней надо указывать исходный проект
позже так-же выложу в готовых решениях

текст на выходе будет примерно таким
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dialogs.ocx
    Version         = 1.0.0
    Company = FelixMacintosh
 
[Consts]
qwe = 1 /Коментарий к qwe
asd = "dfg"
 
[Enums]
wer
    ert = 1
    dfg = 2 /Коментарий к dfg
abc
    a = 0
    b = 1
    c = 2
 
[Procedures]
Function Create(Name As String, Title As Long) As Long
    /Коментарий к Create
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
18.04.2014, 21:21  [ТС]
Я написал как это сделать в общем. Как приеду домой в блоге напишу как получить то, что мы видим в Object Browser (для конкретной библиотеки).
Видимо особо никого не интересует тема работы с указателяи в VB6.
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.04.2014, 21:34
Цитата Сообщение от The trick Посмотреть сообщение
Видимо особо никого не интересует тема работы с указателяи в VB6.
Интересует, просто я сейчас полностью поглощен другим проектом
поэтому не могу сейчас встревать во чтото другое
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
18.04.2014, 22:29  [ТС]
Это лицензионный ключ http://visualbasic.freetutes.c... 4/p40.html
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
18.04.2014, 22:45
Тоесть надо чтоб он был пустой чтоб небыло проблем у клиента, правильно я понял ?
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
18.04.2014, 22:48  [ТС]
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
Тоесть надо чтоб он был пустой чтоб небыло проблем у клиента, правильно я понял ?
Есть платные контролы, а есть бесплатные. Так вот, чтобы также динамически добавлять платные можно задать ключ, например так
Visual Basic
1
Licenses.Add "MyControl", "22345200-abe8-4f60-90c8-0d43c5f6c0f6"
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
18.04.2014, 22:54
Цитата Сообщение от The trick Посмотреть сообщение
Видимо особо никого не интересует тема работы с указателяи в VB6.
Недостаточно знаний для того, чтобы с тобой поспорить
А вообще хотелось бы услышать какие еще можно решать реальные задачи такими знаниями, кроме как:
Цитата Сообщение от The trick Посмотреть сообщение
мы можем делать ActiveX DLL которая является COM библиотекой и работает в любых программах написанных на других языках
Цитата Сообщение от The trick Посмотреть сообщение
Как приеду домой в блоге напишу как получить то, что мы видим в Object Browser (для конкретной библиотеки).
Периодически возникали такие вопросы не у одного меня.
Вот к примеру интересно было бы иметь возможность подключиться к работающей программе и в реальном времени отслеживать состояние всех переменных.
Пусть даже при первом запуске она передает для отслеживания нужные адреса.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
19.04.2014, 00:39  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
Вот к примеру интересно было бы иметь возможность подключиться к работающей программе и в реальном времени отслеживать состояние всех переменных.
В общем случае это невозможно, т.к. локальные переменные существуют только внутри процедур. Получить доступ к глобальным, статическим и приватным переменным можно, но нужно знать их адреса. Также нужно учитывать некоторые особенности VB. Вот простой пример. Имеем одну программу в стандартном модуле которой имеются 5 глобальных переменных:
Visual Basic
1
2
3
4
5
Public lA As Long
Public sB As Single
Public iC As Integer
Public bD As Byte
Public sE As Double
Из другой программы мы сможем прочитать их значения без проблем. Нужно приаттачиться к процессу и считать память по адресу расположения переменных. Правильно это делать присоединяясь в качестве отладчика к процесу, но можно проще. Как в примере. Выбираем наш процесс в списке и жмем Attach. Все! Теперь мы мониторим переменные.
Миниатюры
Вызов любых функций по указателю  
Вложения
Тип файла: zip GetVar.zip (12.3 Кб, 72 просмотров)
3
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,844
Записей в блоге: 79
19.04.2014, 00:47  [ТС]
Цитата Сообщение от Dragokas Посмотреть сообщение
А вообще хотелось бы услышать какие еще можно решать реальные задачи такими знаниями
Ты про указатели на функции? Задач миллион, в блоге я кстати написал туториал как можно работать с указателями на переменные, а с этими двумя возможностями можно много чего делать (колбеки в своих функциях для сортировки нестандартных типов данных, вызов метода по указателю дает большие возможности, я уже описывал можно вызывать обработчики эвентов из модулей например, различные задачи внедрения кода, так же например очень облегчает жизнь в работе с некоторыми API функциями типа SendInput, GetGlyphOutline, саббклассинг, хуки да вариантов очень много).
И самое главное легкий вызов ассемблерных вставок. Я в скором времени сделаю класс для работ с MMX и SSE тогда я там активно буду применять эти знания.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.04.2014, 00:47
Помогаю со студенческими работами здесь

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

Вызов функции по указателю со смещением
Добрый день. Есть 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() { ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru