Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2007, 11:57   #1
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию Как передать объект по наследству?

Моя программка почему-то не работает....

При вызове SetHandleInformation происходит ошибка,

bmp:=TBitmap.Create; bmp.LoadFromFile('pic.bmp');

if not SetHandleInformation(bmp.handle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)
then
MessageBox(0,PChar(SysErrorMessage( GetLastError)),'error',0);

Этот код выдает ошибку "Неверный дескриптор" ...

Если можно рабочий пример наследования объекта (желательно Bitmap-a)

Последний раз редактировалось rpy3uH; 01.11.2007 в 13:20.
Legat вне форума Ответить с цитированием
Старый 30.10.2007, 12:10   #2
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

SetHandleInformation работает только с объектами ядра. Это совсем другие объекты и у них совсем другие дескрипторы, не нужно путать. Читайте Рихтера:
http://wm-help.net/books-online/book...-22.html#head3
Slovinsky вне форума Ответить с цитированием
Старый 30.10.2007, 14:05   #3
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Прекрасно, а как тогда передать Bitmap ?
Не уж-то это никак не сделать? Сам по наследству не передается...
Legat вне форума Ответить с цитированием
Старый 30.10.2007, 14:11   #4
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Объясните лучше что у вас за задача, чего вы хотите и зачем вообще понадобилось наследовать дескриптор битмапа? Нужно передать картинку из одного процесса в другой? Для этого есть свои способы. Варианты:

1. Дочерний процесс грузит картинку из того же файла, что и родительский
2. Процесс-источник сохраняет картинку в TMemoryStream, затем отправляет сообщение WM_COPYDATA, параметры которого содержат указатель на память, где лежит картинка. Процесс-приемник получает сообщение, и загружает картинку из памяти, указатель на которую содержится в параметрах сообщения.
3. Процесс источник и приемник явно используют общий раздел памяти (File Mapping)
4. Другие механизмы межпроцессного взаимодействия (их огромное количество, правда далеко не всех их рационально использовать в данной задаче).

Последний раз редактировалось Slovinsky; 30.10.2007 в 14:34.
Slovinsky вне форума Ответить с цитированием
Старый 01.11.2007, 16:35   #5
Legat
Пользователь
 
Регистрация: 05.10.2007
Сообщений: 34
По умолчанию

Задача немного другая. Хотя, и за эти способы спасибо.
Требуется использовать один битмап одновременно несколькими процессами. Это нужно в целях экономии памяти. Если я его буду передавать описанными способами, то никакой экономии не будет.

Кстати, можно пример по 3. ? (общий раздел памяти File Mapping)

Последний раз редактировалось rpy3uH; 02.11.2007 в 18:35.
Legat вне форума Ответить с цитированием
Старый 02.11.2007, 18:37   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от Legat Посмотреть сообщение
Кстати, можно пример по 3. ? (общий раздел памяти File Mapping)
это самый лучший и самый быстрый способ!
rpy3uH вне форума Ответить с цитированием
Старый 03.11.2007, 11:19   #7
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Цитата:
Кстати, можно пример по 3. ? (общий раздел памяти File Mapping)
А, вам это не поможет, учитывая постановку задачи Дело в том, что графичиские объекты нельзя разделять между процессами также, как объекты ядра. Вам все равно придется гонять память туда-сюда и у каждого просесса будет все равно своя копия объекта-битмапа. А в FileMapping-е будет не сам объект, а данные о нем, с помощью которых вы этот объект будете в удаленном процессе создавать, Так что, дон'т ворри, би хэппи Самый простой способ - это WM_COPYDATA (оно тоже использует FileMapping, только неявно, без вашего участия), но и так память вы не сэкономите.

ЗЫ: Есть один недокументированный способ разделения GDI-объектов, на самом деле. По крайней мере StockObjects (GetStockObject) именно так и разделяются. Но он достаточно сложный в реализации, к тому же, от одной версии системы к другой он может измениться. Возможно он уже изменился и у меня недостоверная информация. Так что воистину дон'т ворри

ЗЗЫ: Если интересует, что за способ я имею в виду, достаньте где-нибудь книгу Феня Юаня про графику в Windows, там описано что представляют собой дескрипторы GDI-объектов, и как сами объекты хранятся в памяти.
Slovinsky вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать параметр? Иллидан Общие вопросы Delphi 8 12.07.2008 12:57
Передать файл клиенту BlackOmen JavaScript, Ajax 7 26.06.2008 11:36
Как передать данные из SQL в файл _ozzy_ БД в Delphi 0 12.06.2008 16:50
Передать Канву Pedro Работа с сетью в Delphi 7 28.04.2008 17:38
передать переменную ar4i Общие вопросы Delphi 10 04.12.2006 14:30