Текущий архив: 2002.11.28;
Скачать: CL | DM;
Вниз
Использование общих ресурсов dll 2мя процессами. Найти похожие ветки
← →
UnDISCOvery © (2002-11-18 18:32) [0]Вот такая проблема у меня, Уважаемые !
Содрал я безжалостно пример из Тейскьеры и Пачеко про совместное использование ресурсов длл-ки двумя процессами. Это там еще используется метод отображения файлов в память.
используется там такая структура:
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". Где грабли ?
Заранее сэнкс.
← →
Юрий Федоров © (2002-11-18 18:51) [1]Адресное пространство все-же разное у двух процессов? следовательно, указатели(каковым по сути является TBitmap) передавать нельзя, или я ошибаюсь?
← →
UnDISCOvery © (2002-11-18 19:02) [2]Видимо не ошибаешся :)) ... Но как бороть ?
← →
Marcus (2002-11-18 19:17) [3]А Bitmap.SaveToStream / AnotherBitmap.LoadFromStream не спасут?
← →
UnDISCOvery © (2002-11-18 19:24) [4]2 Marcus: Думаю - это не устроит с точки зрения скорости ...
2 Юрий: У двух процессов конечно разное, но отображение длл происходит с одного и того же адреса, т.е. оба приложения используют по сути одну и ту же структуру лежащую по определенному адресу. указатели передавать можно и даже нужну, именно черз них и идет весь доступ. А структура указатель на указатель существует безболезненно. Дело в том, не как передавать, а как менять !!! N.B.
← →
reonid © (2002-11-18 19:46) [5]UnDISCOvery © (18.11.02 19:24)
При использовании отображённого в память файла у
тебя в двух приложениях оказывается некий кусок адресного
пространства, общий для обоих.
В этом куске лежит твоя структура TGlobalDLLData.
А указатель B в ней указывает на участок памяти, который
не разделятся между приложениями, и при обращении по этому указателю разные процессы реально обращаются к совершенно
различным страницам памяти.
Чтобы понять, что тут можно сделать, попробуй
более точно описать, что именно тебе нужно.
← →
UnDISCOvery © (2002-11-18 20:27) [6]2 reonid: OK. Понял.
Попытаюсь поточнее ...
При старте приложения App1.exe происходит загрузка 3х файлов .bmp в некий, ну допустим, массив. По нажатию кнопки будет происходит произвольный выбор из этого массива и выбранная картинка должна грузиться в глобальную структуру GlobalData dll-ки.
Приложение App2.exe по таймеру периодически обращается к той же GlobalData и отслеживает все изменения, т.е. обновляет свою картинку согласно картинке из GlobalData.
А если совсем короче, то хочу чтобы было также как и с полями типов string и integer. Начал набирать текст в App1, как тут же эти изменения отображаются и у App2.
Доходчиво ? :)
← →
reonid © (2002-11-18 20:44) [7]Совсем как с string и integer не получится.
Ты, кстати, заметил, что там не string, а string[50]? -
именно потому, что string - указатель.
Можно, например (самый простой путь),
сделать одинаковые массивы битмапов в обоих приложениях,
а в структуре хранить индекс разделяемой структуре.
И соответственно, по нажатию кнопки менять этот индекс.
← →
MBo © (2002-11-19 06:36) [8]Можно использовать несколько вариантов хранения bitmap в общей памяти, например, извлечь BitmapInfoHeader и BitmapBits в блоки данных и держать там их, но проще воспользоваться предложением Marcus - сохранить TBitmap в MemoryStream и этот блок данных держать в shared памяти, тогда код очень прост
← →
UnDISCOvery © (2002-11-19 12:31) [9]Всем спасибо. Если не сложно, то прошу прислать куски кода с реализацией ваших предложений на мыло.
Страницы: 1 вся ветка
Текущий архив: 2002.11.28;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.015 c