Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Общедоступные паременные


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")


я не владею. Поэтому объясни, как это работает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо