В какой переменной хранить значения адресов памяти?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
h2sp4
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 08.05.2008 (Чт) 12:43

В какой переменной хранить значения адресов памяти?

Сообщение h2sp4 » 08.05.2008 (Чт) 12:45

Всем привет =) У меня есть один мааааленький вопрос.

Допустим, я использую процедуру ReadProcessMemory ([процесс], [адрес в памяти], [кол-во байт], [еще что-то])

Так вот, мне бы хотелось, чтобы параметр [адрес в памяти] можно было подставлять как переменную, т.е. что-то вроде:
Код: Выделить всё
Dim pid  As Long
Dim hProcess   As Long
Dim a As String    'еще пробовал как variant, как long - все равно не помогало

GetWindowThreadProcessId hwnd, pid
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, pid)

a="&h5492918"
Call ReadProcessMemory(hProcess, a, 4, 0&)


где a - переменная, хранящая нужный мне hex адрес.

Но VB упорно ругается на а, или выдает не то значение, которое получается если вместо а напрямую писать &h5492918. Как мне задать a, чтобы была возможность подставлять нужный адрес?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.05.2008 (Чт) 12:49

dim a as long
I don't understand. Sorry.

h2sp4
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 08.05.2008 (Чт) 12:43

Сообщение h2sp4 » 08.05.2008 (Чт) 13:49

Спасиб =)

Еще вопросец: какой функцией из VB можно посылать команды (нажатие кнопок вроде F1, Enter, цифр, букв) в другие приложения?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.05.2008 (Чт) 14:12

Можно использовать API SendMessage. Про то, какие сообщения и как посылать - можно погуглить.
I don't understand. Sorry.

h2sp4
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 08.05.2008 (Чт) 12:43

Сообщение h2sp4 » 08.05.2008 (Чт) 15:01

А можно плз простенький пример с SendMessage? =( Я что-то туплю.
Допустим, мы в калькулятор посылаем нажатие кнопки F1. Что должно быть в модуле и какой код самой процедуры поиска калька и посылки запроса? (сорри за ламерство, что-то по поиску не разобрался)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.05.2008 (Чт) 15:32

Private Declare Function SendMessageA Lib "user32" ( _

ByVal hWnd As Long, ByVal uMsg As Long, _

ByVal wParam As Long, ByVal lParam As Long) As Long





hWnd - окно приложения, куда шлем сообщение.

uMsg - код сообщения.



Поищи вообще по форуму, тут есть куча примеров.
I don't understand. Sorry.

h2sp4
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 08.05.2008 (Чт) 12:43

Сообщение h2sp4 » 08.05.2008 (Чт) 15:58

Угу. Я искал. Но в том-то и проблема, что я видимо слишком глуп. Вот программа, которая по идее должна вызывать справку в калькуляторе, но что-то не работает - при нажатии кнопки ничего не происходит.

Код: Выделить всё
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_KEYDOWN = &H100
Private Const VK_F1 = &H70


Private Sub Command1_Click()
    Dim rc&
    rc& = FindWindow(vbNullString, "Калькулятор")
    Call PostMessage(rc&, WM_KEYDOWN, VK_F1, 0&)
End Sub



Кстати, забыл сказать, думаю, это важно. Нуна посылать нажатие клавиши свернутому (неактивному) окну.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.05.2008 (Чт) 16:27

Я бы слал сообщения через send а не через post. Во вторых, проверил бы точно, какие там должны быть lparam/wparam.



В третьих, имя окна должно заканчиваться на chr(0).
I don't understand. Sorry.

h2sp4
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 08.05.2008 (Чт) 12:43

Сообщение h2sp4 » 08.05.2008 (Чт) 16:44

Попробовал send, все то же. Как проверить lparam/wparam я не знаю, брал чужой пример. Но я так понимаю, что в sendmessage первый параметр - окно, второй - действие, третий - кнопка, четвертый - хз.

А что значит "имя окна должно заканчиваться на chr(0)"? :shock:

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 08.05.2008 (Чт) 16:59

Это значит что оно д.б. таким:



"Калькулятор"+Chr(0)
I don't understand. Sorry.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 09.05.2008 (Пт) 20:16

RayShade писал(а):В третьих, имя окна должно заканчиваться на chr(0).


Эм. Если мне не изменяет мой склероз, при вызове API-функции VB сам конвертирует строку из BSTR (которая сама по себе уже null-terminated) в LPSTR (так же null-terminated)...
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 26

    TopList