Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 21.02.2007, 22:35   #1
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию Запись в буфер Delphi & Asm

Приветствую. Ситуация такова. У меня есть буфер в котором будет картинка. При записи в него выскакивает Access Sharing Violation. Я, в принципе, не новичок в программировании, но это моя первая Windows-программа. Раньше как-то ДОСа всё хватало. От Гугла я уже опух и ничего не соображаю. Код примерно такой:

Код:
 asm
   push edi
   mov edi, OutBufPtr
   xor al, al
   stosb  { тут собсна и ошибка доступа к памяти }
   pop edi
end;
Спасибо.
SteelRat вне форума   Ответить с цитированием
Старый 22.02.2007, 14:00   #2
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию

Эмн... Может я плохо обрисовал задачу? Или так вообще не делают? =)
SteelRat вне форума   Ответить с цитированием
Старый 22.02.2007, 21:21   #3
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию

Нашел у немцев.

http://www.fh-wedel.de/~bek/asm/uebss02/ueb08a.html

У меня в принципе всё так же. Может память как-то зарезервировал не так. Не понимаю пока.
SteelRat вне форума   Ответить с цитированием
Старый 22.02.2007, 21:23   #4
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Адрес: Солнечное Тбилиси
Сообщений: 4,806
Репутация: 2006
По умолчанию

страница в которой находятся данные должна быть c флагом доступа PAGE_WRITE
rpy3uH вне форума   Ответить с цитированием
Старый 22.02.2007, 21:35   #5
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию

Как этот флаг выставляется?
В коде этого немца не увидел, вроде, команд о разрешении доступа и тому подобного. Вот.

Последний раз редактировалось SteelRat; 22.02.2007 в 21:42.
SteelRat вне форума   Ответить с цитированием
Старый 23.02.2007, 11:48   #6
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Адрес: Солнечное Тбилиси
Сообщений: 4,806
Репутация: 2006
По умолчанию

Выставляется через VirtualProtect
rpy3uH вне форума   Ответить с цитированием
Старый 24.02.2007, 03:19   #7
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию

Попытался. Делать надо так?

VirtualProtect(OutBufPtr, Width*Height, PAGE_WRITE, OldOutBufPtr);


Во-первых, PAGE_WRITE нигде не определено. Пытался писать различные числовые значения - не угадал.

Во-вторых. В Helpe к Дельфи нигде не нашел ни описания VirtualProtect, ни PAGE_WRITE - ничего. Параметры функции нашел лишь потому, что она описана в юните Windows.


И для чего нужен последний параметр функции?
У меня Дельфи 7.
SteelRat вне форума   Ответить с цитированием
Старый 25.02.2007, 16:56   #8
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Адрес: Солнечное Тбилиси
Сообщений: 4,806
Репутация: 2006
По умолчанию

пробуй PAGE_READWRITE последний параметр функции нужен для того чтобы сохранить туда старые атрибуты защиты
Код:
 var 
   oldpr:DWORD;
.......
   virtualprotect(,,PAGE_READWRITE,@oldpr); // или  virtualprotect(,,PAGE_READWRITE,oldpr)
rpy3uH вне форума   Ответить с цитированием
Старый 25.02.2007, 19:44   #9
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию

Работать работает, но доступа как не было так и нет. Нутром чую - ошибка где-то мелкая-мелкая. Не пойму пока ничего.
SteelRat вне форума   Ответить с цитированием
Старый 26.02.2007, 00:09   #10
SteelRat
Брэйнфакер Про
Форумчанин
 
Аватар для SteelRat
 
Регистрация: 21.02.2007
Адрес: Питер-Гатчина
Сообщений: 51
Репутация: 27
По умолчанию

Цитата:
// Version 1.2 (Juni-09 2004)
// included compiler switch {$0+}. In Delphi 6 and 7 projects using this code
// with compiler optimizations turned off will raise an access violation
// {$O+} will ensure that this unit runs with compiler optimizations.
// This option does *not* influence other parts of the project including this
// unit.
// Thanks to Ralf Manschewski for pointing out this problem.
Нашел здесь http://www.delphipraxis.net/topic115...ndecoding.html

Но не помогло. =)
SteelRat вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запись дисков в Delphi FaTaL Общие вопросы Delphi 16 19.04.2011 20:15
Буфер и паскаль Mago Паскаль 4 29.07.2008 22:19
Запись CD/DVD дисков в Delphi Igoressicus Общие вопросы Delphi 10 17.07.2008 18:40
Запись в файл в Delphi, нужна помощь s-t-r-i-k-e-r Помощь студентам 5 03.06.2008 19:11
Запись на диск через Delphi delphin100 Общие вопросы Delphi 1 09.10.2007 10:10


20:33.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.