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

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

Использование общих ресурсов dll 2мя процессами. [D7, Win2k]


UnDISCOvery ©   (2002-11-18 18:32:00) 

Вот такая проблема у меня, Уважаемые !
Содрал я безжалостно пример из Тейскьеры и Пачеко про совместное использование ресурсов длл-ки двумя процессами. Это там еще используется метод отображения файлов в память.
используется там такая структура:
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = record
S: String[50];
I: Integer;
B: TBitmap; <---- Это добавил я !!!
end;

Есть два приложения: App1, App2. В первом меняются поля GlobalData, второе это отслеживает по таймеру. Со строковым полем и числовом проблем никаких, а вот с Битмапом ничего не получается. Второе ну ни в какую не хочет видеть изменения, которое вносит первое. Или AV или "Неверный дескриптор"? или вообще "Can`t Assign s TBitmap to a TBitmap". Где грабли ?
Заранее сэнкс.


UnDISCOvery   (2002-11-19 12:31:00) [1]

Всем спасибо. Если не сложно, то прошу прислать куски кода с реализацией ваших предложений на мыло.


MBo   (2002-11-19 06:36:00) [2]

Можно использовать несколько вариантов хранения bitmap в общей памяти, например, извлечь BitmapInfoHeader и BitmapBits в блоки данных и держать там их, но проще воспользоваться предложением Marcus - сохранить TBitmap в MemoryStream и этот блок данных держать в shared памяти, тогда код очень прост


reonid   (2002-11-18 20:44:00) [3]

Совсем как с string и integer не получится.
Ты, кстати, заметил, что там не string, а string[50]? -
именно потому, что string - указатель.

Можно, например (самый простой путь),
сделать одинаковые массивы битмапов в обоих приложениях,
а в структуре хранить индекс разделяемой структуре.

И соответственно, по нажатию кнопки менять этот индекс.


UnDISCOvery   (2002-11-18 20:27:00) [4]

2 reonid: OK. Понял.

Попытаюсь поточнее ...
При старте приложения App1.exe происходит загрузка 3х файлов .bmp в некий, ну допустим, массив. По нажатию кнопки будет происходит произвольный выбор из этого массива и выбранная картинка должна грузиться в глобальную структуру GlobalData dll-ки.
Приложение App2.exe по таймеру периодически обращается к той же GlobalData и отслеживает все изменения, т.е. обновляет свою картинку согласно картинке из GlobalData.

А если совсем короче, то хочу чтобы было также как и с полями типов string и integer. Начал набирать текст в App1, как тут же эти изменения отображаются и у App2.

Доходчиво ? :)


reonid   (2002-11-18 19:46:00) [5]

UnDISCOvery © (18.11.02 19:24)
При использовании отображённого в память файла у
тебя в двух приложениях оказывается некий кусок адресного
пространства, общий для обоих.
В этом куске лежит твоя структура TGlobalDLLData.

А указатель B в ней указывает на участок памяти, который
не разделятся между приложениями, и при обращении по этому указателю разные процессы реально обращаются к совершенно
различным страницам памяти.

Чтобы понять, что тут можно сделать, попробуй
более точно описать, что именно тебе нужно.


UnDISCOvery   (2002-11-18 19:24:00) [6]

2 Marcus: Думаю - это не устроит с точки зрения скорости ...
2 Юрий: У двух процессов конечно разное, но отображение длл происходит с одного и того же адреса, т.е. оба приложения используют по сути одну и ту же структуру лежащую по определенному адресу. указатели передавать можно и даже нужну, именно черз них и идет весь доступ. А структура указатель на указатель существует безболезненно. Дело в том, не как передавать, а как менять !!! N.B.


Marcus   (2002-11-18 19:17:00) [7]

А Bitmap.SaveToStream / AnotherBitmap.LoadFromStream не спасут?


UnDISCOvery   (2002-11-18 19:02:00) [8]

Видимо не ошибаешся :)) ... Но как бороть ?


Юрий Федоров   (2002-11-18 18:51:00) [9]

Адресное пространство все-же разное у двух процессов? следовательно, указатели(каковым по сути является TBitmap) передавать нельзя, или я ошибаюсь?


Наверх

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