Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизОбщедоступные паременные Найти похожие ветки
← →
DelphiLexx (2004-09-22 18:02) [0]С++ позволяет создвать переменные в общедоступном блоке памяти:
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")
Вопрос: Как сделать аналогичное на Delphi, без использования
CreateFileMapping.
← →
Суслик © (2004-09-22 18:07) [1]Языком си в объеме, достаточном, чтобы понять конструкцию
#pragma data_seg("Shared")
HHOOK g_hhook = NULL;
#pragma data_seg()
#pragma comment(linker, "/Section:Shared,rws")
я не владею. Поэтому объясни, как это работает.
← →
Lin7 (2004-09-22 18:13) [2]К сожелению в Delphi нельзя подобным образом задать атрибуты доступа к отдельному сегменту памяти - все маятся через отображение файлов в память...
← →
DelphiLexx (2004-09-22 18:19) [3]Этот код позволяет делать следующее:
Он говорит компилятору, что нужно создать exe-файл в котором есть блок Shared и переменные (g_hhook) этого блока должны стать общедоступными т.е. если есть два и более разных процессов, то изменение переменной g_hhook станет видным другому процессу.
Пример:
---------------------------
АДРЕСНОЕ ПРОСТРАНСТВО
ПРОЦЕССА1
///////////////
ДАННЫЕ ПРОЦЕССА1
//////////////
///////////////
КОД ПРОЦЕССА1:
...
g_hook:=6;
...
//////////////
---------------------------
---------------------------
АДРЕСНОЕ ПРОСТРАНСТВО
ПРОЦЕССА2
///////////////
ДАННЫЕ ПРОЦЕССА2
//////////////
///////////////
КОД ПРОЦЕССА2:
...
Здесь g_hhook может быть
равен т.е. g_hook=6;
...
//////////////
---------------------------
← →
jack128 © (2004-09-22 18:21) [4]DelphiLexx (22.09.04 18:19) [3]
э-э-э..А как это согласуется с идеей отдельного ВАП для каждого процесса в виндах??
← →
Defunct © (2004-09-22 18:24) [5]jack128 © (22.09.04 18:21) [4]
ВАП обеих процессов пересекаются в какой-то Shared области
← →
Суслик © (2004-09-22 18:25) [6]
> [3] DelphiLexx (22.09.04 18:19)
Если я конечно не совсем слабак, то вроде в дельфи такого нет.
← →
DelphiLexx (2004-09-22 18:29) [7]Обращаюсь ко всем Delphi"стам и вспомнить может как-то можно сделать подобное
← →
Lin7 (2004-09-22 18:32) [8]Уточни: зачем тебе это? Ты переводишь исходник из С++ на Delphi?
← →
Defunct © (2004-09-22 18:33) [9]DelphiLexx (22.09.04 18:29) [7]
IMHO сгодится SendMessage WM_COPYDATA если общих данных не сильно много.
← →
den_777 (2004-09-22 18:38) [10]а разве
createFileMapping(dword(-1),nil,PAGE_READWRITE,0,sz,PChar(MemForAll))
memforall:string с уникальным значением известным обоим процессам.
а dword(-1) указывает на то что надо создать поименованный участок памяти, а не отобразить файл.
Разве это не тоже самое.
← →
DelphiLexx (2004-09-22 18:41) [11]Я не считаю себя программером на С++, а код всретил в примере по внедрению dll"ок в чужое адресное пространство. Конечно эту технологию можно восстановить через CreateFileMapping, но поверьте моему опыту не всегда это сработает на 100%
← →
jack128 © (2004-09-22 18:44) [12]Defunct © (22.09.04 18:24) [5]
ВАП обеих процессов пересекаются в какой-то Shared области
Хм. Насколько я знаю только в верхней паре гигов, только Win9x и эта память только readonly (там код системных dll)
пойти Рихтра почитать, чтоли..
← →
Lin7 (2004-09-22 18:47) [13]
> DelphiLexx (22.09.04 18:41) [11]
> Я не считаю себя программером на С++, а код всретил в примере
> по внедрению dll"ок в чужое адресное пространство. Конечно
> эту технологию можно восстановить через CreateFileMapping,
> но поверьте моему опыту не всегда это сработает на 100%
Поверьте моему опыту - в правильно написанном коде это работает всегда корректно.
← →
DelphiLexx (2004-09-22 18:49) [14]Lin 7 и все же мне необходим аналог кода на С++
← →
wicked © (2004-09-22 18:52) [15]такие секции в самой делфи создать нельзя, хотя можно воспользоваться посторонними средствами и поправить готовый бинарник...
но такие секции считаются дырой в безопасности:
http://weblogs.asp.net/oldnewthing/archive/2004/08/04/208003.aspx (сайт-блог одного из разработчиков виндовс)....
← →
Lin7 (2004-09-22 18:56) [16]
> DelphiLexx (22.09.04 18:49) [14]
Механизм SendMessage WM_COPYDATA работает тоже через CreateFileMapping.
В данной ситуации у тебя два пути - через WM_COPYDATA или через CreateFileMapping.
Сорри примеры писать некогда - пора с работы домой.
Goggle обычно помогает...
Удачи.
← →
Суслик © (2004-09-22 18:59) [17]
> Goggle обычно помогает...
Еще очень хорошо помогает вот эта книга http://www.books.ru/shop/books/8283.
Она есть в сети в электронном варианте.
← →
DiamondShark © (2004-09-22 19:41) [18]
> jack128 © (22.09.04 18:44) [12]
> Defunct © (22.09.04 18:24) [5]
> ВАП обеих процессов пересекаются в какой-то Shared области
>
> Хм. Насколько я знаю только в верхней паре гигов, только
> Win9x и эта память только readonly (там код системных dll)
Причём тут верхняя пара гигов?
Виртуальные адреса этой области могут быть любыми.
Просто они отображаются на одни и те же физические страницы.
← →
jack128 © (2004-09-22 20:00) [19]DiamondShark © (22.09.04 19:41) [18]
Виртуальные адреса этой области могут быть любыми.
Просто они отображаются на одни и те же физические страницы.
А!! Я подумал, что виртуальные адреса тоже совпадают.. Тогда понятно..
← →
Lin7 (2004-09-23 10:17) [20]
> Суслик © (22.09.04 18:59) [17]
Была здесь
http://alexsoft.home.nov.ru/download/prog/
только мне кажется, что DelphiLexx и так свой кусочек
> #pragma data_seg("Shared")
> HHOOK g_hhook = NULL;
> #pragma data_seg()
> #pragma comment(linker, "/Section:Shared,rws")
оттуда взял...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c