Возможно ли обращение из vb к оперативной памяти?

Программирование на Visual Basic for Applications
Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Возможно ли обращение из vb к оперативной памяти?

Сообщение Ashlex » 21.04.2008 (Пн) 20:33

И считывать данные из неё в переменную,зная адрес в памяти? как это реализовать? если это возможно.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 21.04.2008 (Пн) 21:08

Да. А вообще вроде много было таких вопросов, если поискать, то найдутся в том числе и примеры.
Salus populi suprema lex

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 21.04.2008 (Пн) 22:52

В целом - неправильная постановка вопроса. Оперативная память - это устройство такое внутри компьютера.

Непонятно, что ты имеешь ввиду - физическую память или виртуальную память.

Если ты имеешь ввиду физическую память, к которой ближе понятие "оперативная память", то к ней нельзя обращаться из VB. Но к ней вообще нельзя обращаться из пользовательского режима под Windows безотносительно языка программирования, на котором пишется приложение.

Если имеется ввиду виртуальная память, то в общем - да, можно.

Далее неправильная постановка продолжается в следующем:
И считывать данные из неё [памяти] в переменную,зная адрес в памяти?

Переменная, -- она тоже располагается в памяти. Поэтому "считывать данные из памяти в переменную" = "Копировать данные из одного места в памяти в другое". А для этого есть функция CopyMemory.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 22.04.2008 (Вт) 6:31

я ламак в программированнии и поэтому могу назвать вещи не своими именами. вот. мне нужно чтобы данные из виртуальной памяти можно было передавать в Excel. ведь виртуальная память разбита на адреса. так? вот. и зная заведомо адрес мне нужно обратиться по данному адресу и передать из него информацию в excel

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

Сообщение RayShade » 22.04.2008 (Вт) 12:25

Хакер, не занимайся софистикой :)



Ashlex, ищи по форуму слово copymemory и читай, что да как.
I don't understand. Sorry.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 22.04.2008 (Вт) 14:27

Ashlex
Для передачи информации в другие приложения нужно использовать API этих приложений.
У microsoft excel API выражается в виде общирной и хорошо документированной древовидной модели. Ищи что тебе нужно и делай. А "писать в память" это весьма неуместный стиль программирования, особенно ввиду современных веяний моды.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 23.04.2008 (Ср) 6:47

так мне нужно не писать в память и не передавать программе что-то, а вытащить из неё нужные мне данные , и я хотел реализовать это таким способом,а также получить пример реализации. и ответ на вопрос- возможно ли их добыть таким способом?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.04.2008 (Ср) 7:56

Перевожу сказанное ANDLL.
Ты не сможешь добраться к данным Excel прямым обращением к памяти процесса.
Для работы с данными Excel используется COM. В поиск по фразе "Excel.Application".
Lasciate ogni speranza, voi ch'entrate.

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 23.04.2008 (Ср) 19:48

мне нужны данные не из excel,а из совершенно другой программы. вот как работают программы-читеры, которые работают с памятью,типа artmoney и подобных? вот мне нужно почти тоже самое. только работать уже с заранее известными адресами и извлекать из них данные и передавать в excel. т.е мне известен диапазон адресов в памяти, мне нужны данные из них.вопрос. как их от туда извлечь хотя бы? не скриншоты же делать при активном окне программы и распознавать с помощью файнридера те данные которые мне нужны и передавать в Эксель.))))

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 24.04.2008 (Чт) 8:05

Задавай конкретные вопросы.
Lasciate ogni speranza, voi ch'entrate.

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 24.04.2008 (Чт) 9:13

А как еще конкретизировать?

есть программа. в ней не предусмотрен нужный мне экспорт. я нахожу в памяти адреса где находятся эти данные. мне их надо передать в эксель. всё. будут ли они смещаться адреса при следующем запуске программы это другой вопрос. пока же мне нужно реализовать то что описано выше.

допустим по адресу (для примера)
04BCDA80 находится 4 байтное или с плавающей точкой число

в vb нужно реализовать чтобы он извлек число из этого адреса и передал в эксель. вот в принципе и всё. на словах звучит просто,а как это реализовать ума не приложу.поэтому и обратился сюда.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 24.04.2008 (Чт) 15:57

Ashlex
Хосспди! А у этой таинственной программы какой интерфейс? Может обратиться к соответствующим окнам (внимание! окна это не только формы;)) и получить из них содержащиеся в них данные? Топик по этому вопросу был, недавно обсуждали, с примерами...
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 24.04.2008 (Чт) 18:37

программа не таинственная. торговый терминал quik. http://quik.ru. я же говорю что я не разбираюсь пракически в программировании и мне нужен пример. Денис, а где эта тема?

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 25.04.2008 (Пт) 7:26

в общем посмотрел я эти темки с окнами, в quik не получится так вытащить данные. придется наверное пользоваться экспортом по odbc

Ashlex
Начинающий
Начинающий
 
Сообщения: 9
Зарегистрирован: 21.04.2008 (Пн) 20:28

Сообщение Ashlex » 27.04.2008 (Вс) 12:11

Нашел все-таки. может кому-то интересно будет.

Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Declare Function GetWindowThreadProcessId Lib “user32” (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Declare Function OpenProcess Lib “kernel32” (ByVal dwDesiredAcess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Declare Function WriteProcessMemory Lib “kernel32” (ByVal hProcess As Long, ByVal lpBaseAdress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Declare Function ReadProcessMemory Lib “kernel32” (ByVal hProcess As Long, ByVal lpBaseAddess As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWriten As Long) As Long
Declare Function CloseHandle Lib “kernel32” (ByVal hObject As Long) As Long


Private Sub Command1_Click() ' Объявляем некоторые необходимые моменты для кнопки.
Dim hwnd As Long ' удерживает управление, переданное функцией Find Window.
Dim pid As Long' используется для хранения идентификатора процесса.
Dim pHandle As Long' держит управление процессом.
' Ищем окно игры и, если игра не запущена, выдаем сообщение об ошибке.
hwnd = FindWindow(vbNullString, "Sim City 3000")
If (hwnd = 0) Then
MsgBox "Window not found!"
Exit Sub
End If
' Теперь можно определить идентификатор процесса.
GetWindowThreadProcessId hwnd, pid
' Используем этот идентификатор для получения управления процессом.
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then
MsgBox "Couldn't get a process handle!"
Exit Sub
End If
' Теперь можно записать новое значение в память по нужному адресу.
WriteProcessMemory pHandle, &H235B218, "Beans", 5, 0&
' Прекращаем управлять процессом.
CloseHandle hProcess
End Sub
Private Sub ReadTimer_Timer()
' Объявляем некоторые необходимые моменты для таймера.
Dim hwnd As Long' удерживает управление, переданное функцией FindWindow.
Dim pid As Long ' удерживает идентификатор процесса.
Dim pHandle As Long ' удерживает управление процессом.
Dim str As String * 20 ' параметр текстовой строки.
' Вначале ищем окно игры.
hwnd = FindWindow(vbNullString, "Sim City 3000")
If (hwnd = 0) Then Exit Sub
' Теперь можно определить идентификатор процесса.
GetWindowThreadProcessId hwnd, pid
' Используем идентификатор для управления процессом.
pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
If (pHandle = 0) Then Exit Sub
' Теперь можно прочитать из памяти...
ReadProcessMemory pHandle, &H235B218, str, 20, 0&
' ... и показать строку в текстовом поле трейнера.
txtDisplay = str
' Прекращаем управлять процессом.
CloseHandle hProcess
End Sub


Вернуться в VBA

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 83

    TopList