Простые вопросы про Memory

Программирование на Visual Basic for Applications
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Простые вопросы про Memory

Сообщение Avtopic » 14.12.2006 (Чт) 12:04

Здравствуйте!
Код: Выделить всё
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, sa, PAGE_READWRITE, 0, 1024, vbNullString)


такие вопросы, если можно:
1. Гарантирует это или нет, что пока я не закрою хендл, пространство памяти моё.
2. Если по каким то причинам мой процесс прервался без CloseHandle hMapFile, поимет или нет Windows, что пространство памяти можно использовать для других целей.
3. В какую сторону искать, для записи и чтенья не всех 1024 байтов, а допустим байтов с 120 по 128.

Спасибо!

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 14.12.2006 (Чт) 12:49

1. Пространство памяти может быть не твое?
2. Если твой процесс прервался его "пространство" просто будет изничтожено
3. Это указывается в MapViewOfFile

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 14.12.2006 (Чт) 14:10

Avtopic писал(а):В какую сторону искать, для записи и чтенья не всех 1024 байтов, а допустим байтов с 120 по 128
_ae_ писал(а):Это указывается в MapViewOfFile

и что, если в другом процессе я хочу записать отдельными байтами 1024 байта в разные моменты я должен 1024 раза вызывать MapViewOfFile? :shock:

_ae_
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 165
Зарегистрирован: 08.10.2006 (Вс) 14:37

Сообщение _ae_ » 14.12.2006 (Чт) 15:55

и что, если в другом процессе я хочу записать отдельными байтами 1024 байта в разные моменты я должен 1024 раза вызывать MapViewOfFile?
А? :scratch:

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 14.12.2006 (Чт) 17:54

Если “А?” значит что _ae_ не понял вопроса, спрошу по другому:

хочу последовательно, или непоследовательно, не в цикле, записать во все 1024 байта что-то. Как записать из этих 1024, в 574 – ий и 575 – ий байт, два байта, к примеру, содержимое переменного типа Integer

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.12.2006 (Чт) 18:08

Гм. А как записывать в 1-ый и 2-ой, знаешь?
Или вообще ни в какой не знаешь?
Изображение

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 14.12.2006 (Чт) 18:35

Знаю, не указывая адреса

Код: Выделить всё
CopyMemory ByVal hViewFile, mStr, LenB(mStr)


Где mStr String, а hViewFile сами знаете.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 14.12.2006 (Чт) 18:46

Ой, спасибо, не обращал внимания, что первый параметр CopyMemory, это тоже адрес. :oops:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 14.12.2006 (Чт) 18:51

А если к адресу массива прибавить 573, то получится адрес его 574-го байта...
Изображение

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 14.12.2006 (Чт) 19:06

Спасибо еще раз. Я думал hViewFile это дескриптор. Оказывается он и есть адрес.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 12:01

продолжаю :) :oops: .

Процесс 1:
Код: Выделить всё
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, sa, PAGE_READWRITE, 0, 1024, “My_File”)
hViewFile = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0)

mStr =”Hello +++”
CopyMemory ByVal hViewFile, mStr, LenB(mStr)
CopyMemory sSave, ByVal hViewFile, LenB(hViewFile)
Debug.Print sSave
результат =”Hello +++”

Процесс 2:
Код: Выделить всё
hMapFile = OpenFileMapping(PAGE_READWRITE, 0, “My_File”)
hViewFile2 = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0)

CopyMemory sSave, ByVal hViewFile2, LenB(hViewFile2)
Debug.Print sSave
результат= ””

Вопрос1: почему?
Вопрос2: Если результатом CreateFileMapping и OpenFileMapping дольжен быть одно и тоже пространство памяти, и MapViewOfFile возвращает начальный адрес этой области, почему hViewFile <> hViewFile2 ? Вед это должно быть одно и тоже пространство?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.12.2006 (Пт) 12:10

LenB(hViewFile2) - это сильно...
Прочем, копирование в неотведённый буфер - ещё сильнее...

А hViewFile <> hViewFile2 потому, что это виртуальные адреса...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 12:31

GSerg писал(а):LenB(hViewFile2) - это сильно...
ну, здесь слов нет. Сам понимаю что тупость.Там у меня всегда 10, почему в форум так написал, не знаю.

Прочем, копирование в неотведённый буфер - ещё сильнее...
В коде у меня сидит sSave = Space(10). Если это называется отведённый буфер, то он у меня есть, если нет, поразмыслю.

А hViewFile <> hViewFile2 потому, что это виртуальные адреса
А как достать реальные адреса, или он сам будет подразумевать реальные по этим виртуальным

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.12.2006 (Пт) 12:51

Так хотелось бы увидеть реальный вариант кода, а не адаптированный для форума...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 14:19

Процесс 1:
Код: Выделить всё
Dim hViewFile As Long
Dim hMapFile As Long

Private Sub Form_Load()
hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 1024, "My_File")

If hMapFile = 0 Then MsgBox ("Can't Create memory!"): Exit Sub

hViewFile = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0)

If hViewFile = 0 Then MsgBox ("Can't View memory!"): Exit Sub

Label1.Caption = hMapFile
Label2.Caption = hViewFile
    If hViewFile <> 0 Then UnmapViewOfFile hViewFile
End Sub

Private Sub Form_Unload(Cancel As Integer)
If hMapFile <> 0 Then CloseHandle hMapFile
End Sub

Процесс 2:
Код: Выделить всё
Dim hViewFile2 As Long
Dim hMapFile As Long

Private Sub Form_Load()
Dim sSave As String
sSave = Space(10)

hMapFile = OpenFileMapping(PAGE_READWRITE, 0, "My_File")
If hMapFile = 0 Then MsgBox ("Can't Create memory!"): Exit Sub
hViewFile2 = MapViewOfFile(hMapFile, PAGE_READWRITE, 0, 0, 0)
If hViewFile2 = 0 Then MsgBox ("Can't View memory!"): Exit Sub



CopyMemory sSave, ByVal hViewFile2, 10

hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 1024, "My_File")

hViewFile2 = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0)

Label1.Caption = hMapFile
Label2.Caption = hViewFile2
Label3.Caption = sSave
If hViewFile2 <> 0 Then UnmapViewOfFile hViewFile2
End Sub

Private Sub Form_Unload(Cancel As Integer)
If hMapFile <> 0 Then CloseHandle hMapFile
End Sub
Чуть-чуть все ровно пришлось очистить код, там столько мусора за два дня, что сам еле разбираюсь.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.12.2006 (Пт) 14:35

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

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 15:38

первым долгом, внятно обясню.

Не сидит в коде после CopyMemory ничего. У меня там после многих
попыток и пыток огромное количество, то код, то закомментированный код, Этот участок был закомментирован.
Сожалею очень и извиняюсь.
реально во втором процессе работает следующий код:
Код: Выделить всё
Dim hViewFile2 As Long
Dim hMapFile As Long

Private Sub Form_Load()
Dim sSave As String
sSave = Space(10)

hMapFile = OpenFileMapping(PAGE_READWRITE, 0, "My_File")
If hMapFile = 0 Then MsgBox ("Can't Create memory!"): Exit Sub
hViewFile2 = MapViewOfFile(hMapFile, PAGE_READWRITE, 0, 0, 0)
If hViewFile2 = 0 Then MsgBox ("Can't View memory!"): Exit Sub

CopyMemory sSave, ByVal hViewFile2, 10
'
'
Label1.Caption = hMapFile
Label2.Caption = hViewFile2
Label3.Caption = sSave
If hViewFile2 <> 0 Then UnmapViewOfFile hViewFile2
End Sub

Private Sub Form_Unload(Cancel As Integer)
If hMapFile <> 0 Then CloseHandle hMapFile
End Sub

Я этот участок проходил в пошаговом режиме тысячу раз. все хендли
и переменние как будто бы принимают нужное значенье, но после CopyMemory в sSave “ “ заменяется на ““ и все.
Я этот CopyMemory перенес даже в ваш код (известный топик по моему “Копирование массивов между процессами”), там тоже
в sSave оказывается ““

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.12.2006 (Пт) 15:51

Не иначе, надо CopyMemory ByVal sSave, ...?
Изображение

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 16:28

Пробовал tyomitch
Пробовал комбинации:

...sSave, ByVal hViewFile2
...ByVal sSave, ByVal hViewFile2
...StrPtr(sSave) , ByVal hViewFile2
...

и т.д.

В первом процессе копирует, во втором нет. Значит, копирует не из той области.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 15.12.2006 (Пт) 17:56

Avtopic писал(а):Пробовал tyomitch
Пробовал комбинации:

...sSave, ByVal hViewFile2
...ByVal sSave, ByVal hViewFile2
...StrPtr(sSave) , ByVal hViewFile2
...

и т.д.

В первом процессе копирует, во втором нет. Значит, копирует не из той области.


Остается попроьбовать

Код: Выделить всё
CopyMemory ByVal StrPtr(sSave, ByVal hViewFile2, nBytes
Весь мир матрица, а мы в нем потоки байтов!

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 18:34

Изменил имя файла “My_File” на “My_File1”, начал копировать.
Перезагрузил компьютер, копирует и при “My_File”
???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.12.2006 (Пт) 18:40

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

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.12.2006 (Пт) 18:50

Да, но с концом процесса должен же, он освободится, но это не вы писали.
Всем очень большое спасибо!


Вернуться в VBA

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

Сейчас этот форум просматривают: Google-бот и гости: 89

    TopList