![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование общих ресурсов 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) передавать нельзя, или я ошибаюсь?