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