Пердача HBitmap в другой процесс
От: Druidoff  
Дата: 06.03.08 13:24
Оценка:
Привет всем!!! У мя такая ситуация есть процесс А и процесс Б, нада чтоб процесс А послал запрос процессу Б, а на это процесс Б должен сформировать картинку HBITMAP и передать ее назад процессу А. Я для этого пробывал использовать namedPipe. Сделал PipeServer(процесс Б) и PipeClient (процесс А). Со строками(числами) все работает стрка все передается и принимается нормально.А вот кода я пытюсь вместо строки передать HBitmap то на выходе = 0. Почему ниче не могу понять. Еще нащел Апишку DuplicateHandle() но я не пойму как ей пользоваться т.к.:

BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, — эт понятно процесс источник GetCurrentProcess()...
HANDLE hSourceHandle, эт хендл источник тож понятно наприер HBitmap
HANDLE hTargetProcessHandle,эт понятно процесс приемник тут OpenProcess () и т.п.
LPHANDLE lpTargetHandle, — а вот здеь не пойму как мне передать переменную (или ее адрес)из процесса А в процесс B?????
DWORD dwDesiredAccess, --дальше все ясно!
BOOL bInheritHandle,
DWORD dwOptions
);

Может еще есть какието вариатны Предачи изображения медлу процессами, напишите плиз. Может ктот занималься этим.Заранее благодарен!!!
Re: Пердача HBitmap в другой процесс
От: AndrewJD США  
Дата: 06.03.08 13:55
Оценка:
Здравствуйте, Druidoff, Вы писали:

D>Привет всем!!! У мя такая ситуация есть процесс А и процесс Б, нада чтоб процесс А послал запрос процессу Б, а на это процесс Б должен сформировать картинку HBITMAP и передать ее назад процессу А. Я для этого пробывал использовать namedPipe. Сделал PipeServer(процесс Б) и PipeClient (процесс А). Со строками(числами) все работает стрка все передается и принимается нормально.А вот кода я пытюсь вместо строки передать HBitmap то на выходе = 0. Почему ниче не могу понять. Еще нащел Апишку DuplicateHandle() но я не пойму как ей пользоваться т.к.:


GDI обьекты нельзя передовать между процессами.


D>Может еще есть какието вариатны Предачи изображения медлу процессами, напишите плиз.


Можно попробывать использовать shared memory. Т.е. одно приложение генерит изображение в память, а второе его использует.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re: Пердача HBitmap в другой процесс
От: pjBrain  
Дата: 06.03.08 14:32
Оценка:
Здравствуйте, Druidoff, Вы писали:


D>BOOL DuplicateHandle(

D> HANDLE hSourceProcessHandle, — эт понятно процесс источник GetCurrentProcess()...
D> HANDLE hSourceHandle, эт хендл источник тож понятно наприер HBitmap
D> HANDLE hTargetProcessHandle,эт понятно процесс приемник тут OpenProcess () и т.п.
D> LPHANDLE lpTargetHandle, — а вот здеь не пойму как мне передать переменную (или ее адрес)из процесса А в процесс B?????
D> DWORD dwDesiredAccess, --дальше все ясно!
D> BOOL bInheritHandle,
D> DWORD dwOptions
D>);

В MSDN на странице описания функции DuplicateHandle
представлен список обьектов для которых работает функция.
HBitmap — а, это GDI обьект и с помощью данной функции его дубликат сделать не удасться.


HBitmap — это хендел, т.е. указатель на обьект "Изображение".
В самом обьекте храниться информация о размере данного обьекта и др. дополнительные данные.
Получите в приложении "Б" массив пикселей картинки, к примеру как указано тут
Автор: pjBrain
Дата: 04.03.08
и передайте этот массив байт через тотже пайп, который вы умеете уже использовать.
В приложении "А" из этого массива данных и доп. данных востановите изображение (HBitmap).
Re[2]: Пердача HBitmap в другой процесс
От: Druidoff  
Дата: 06.03.08 17:07
Оценка:
Здравствуйте, pjBrain, Вы писали:

B>HBitmap — это хендел, т.е. указатель на обьект "Изображение".

B>В самом обьекте храниться информация о размере данного обьекта и др. дополнительные данные.
B>Получите в приложении "Б" массив пикселей картинки, к примеру как указано тут
Автор: pjBrain
Дата: 04.03.08
и передайте этот массив байт через тотже пайп, который вы умеете уже использовать.

B>В приложении "А" из этого массива данных и доп. данных востановите изображение (HBitmap).


пасиб!! пердача структуры работает. получил я в приложении "А" струтуру DIBSECTION sDC;
терь пытаюсь востанвить изображение HBitmap:


HBITMAP hbmp2;
hbmp2 = CreateBitmap(sDC.dsBm.bmWidth, //ширина
sDC.dsBm.bmHeight, //высота
sDC.dsBm.bmPlanes, //Число цветовых плоскостей в каpте бит.
32, //Число бит цвета на элемент отобpажения дисплея.
sDC.dsBm.bmBits); //адрес начала данных

if (hbmp2 == 0) printf ("err0r HBITMAP\n");

CreateBitmap -возращает всяку ересь
-1845159954
GetLastError = 0
Почему такая ересь не могу понять,В чем проблема не понятно в приложении "Б" : HBITMAP реальный
Пасиб за ответ!!
Re[3]: Пердача HBitmap в другой процесс
От: Pavel Dvorkin Россия  
Дата: 07.03.08 03:49
Оценка:
Здравствуйте, Druidoff, Вы писали:

D>пасиб!! пердача структуры работает.


Только вот указатели из этой структры смысла в другом процессе не имеют.

D> sDC.dsBm.bmBits); //адрес начала данных


Вот этот именно указатель

Еще раз — не структуру передавать надо, а картинку. Все байты картинки. Массив.
With best regards
Pavel Dvorkin
Re[4]: Пердача HBitmap в другой процесс
От: Druidoff  
Дата: 09.03.08 08:40
Оценка:
А если передевать контекст устройства HDC
Ну типа
DC=getDC(0);
BitBlt(DC, X, Y, cX, cY, TempDC, 0, 0, SRCCOPY)

TempDC — перередать в другой процесс, или тож возникает тажае проблема!!
Может есть еще какието варианты!!
Re[5]: Пердача HBitmap в другой процесс
От: Gigachel Украина  
Дата: 09.03.08 22:37
Оценка:
Здравствуйте, Druidoff, Вы писали:

D>А если передевать контекст устройства HDC

D>Ну типа
D>DC=getDC(0);
D>BitBlt(DC, X, Y, cX, cY, TempDC, 0, 0, SRCCOPY)

D>TempDC — перередать в другой процесс, или тож возникает тажае проблема!!

D>Может есть еще какието варианты!!

сделай DIB-секцию через CreateDIBSection с хэндлом разделяемой памяти — вот последний и можно дублировать, и передавать в другие процессы после этой процедуры
Re[6]: Пердача HBitmap в другой процесс
От: Druidoff  
Дата: 10.03.08 09:45
Оценка:
Здравствуйте, Gigachel, Вы писали:

G>Здравствуйте, Druidoff, Вы писали:


D>>А если передевать контекст устройства HDC

D>>Ну типа
D>>DC=getDC(0);
D>>BitBlt(DC, X, Y, cX, cY, TempDC, 0, 0, SRCCOPY)

D>>TempDC — перередать в другой процесс, или тож возникает тажае проблема!!

D>>Может есть еще какието варианты!!

G>сделай DIB-секцию через CreateDIBSection с хэндлом разделяемой памяти — вот последний и можно дублировать, и передавать в другие процессы после этой процедуры


Можно тупой вопрос Что такое "хэндлом разделяемой памяти"?
Re[5]: Пердача HBitmap в другой процесс
От: AndrewJD США  
Дата: 11.03.08 12:24
Оценка:
Здравствуйте, Druidoff, Вы писали:

D>А если передевать контекст устройства HDC


Перестань фигней страдать. Ясно же написали — GDI обьекты НЕЛЬЗЯ передовать между процессами. Передавай сами данные в виде массива
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[7]: Пердача HBitmap в другой процесс
От: Gigachel Украина  
Дата: 11.03.08 12:36
Оценка:
Здравствуйте, Druidoff, Вы писали:

D>Здравствуйте, Gigachel, Вы писали:


G>>Здравствуйте, Druidoff, Вы писали:


D>>>А если передевать контекст устройства HDC

D>>>Ну типа
D>>>DC=getDC(0);
D>>>BitBlt(DC, X, Y, cX, cY, TempDC, 0, 0, SRCCOPY)

D>>>TempDC — перередать в другой процесс, или тож возникает тажае проблема!!

D>>>Может есть еще какието варианты!!

G>>сделай DIB-секцию через CreateDIBSection с хэндлом разделяемой памяти — вот последний и можно дублировать, и передавать в другие процессы после этой процедуры


D>Можно тупой вопрос Что такое "хэндлом разделяемой памяти"?


Если посмотреть описание CreateDIBSection в msdn, то там все будет описано — что за хэндл и с чем его есть.
Re[6]: Пердача HBitmap в другой процесс
От: Andrew S Россия http://alchemy-lab.com
Дата: 11.03.08 18:23
Оценка:
D>>А если передевать контекст устройства HDC

AJD>Перестань фигней страдать. Ясно же написали — GDI обьекты НЕЛЬЗЯ передовать между процессами. Передавай сами данные в виде массива


На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца. А самый простой способ — через клипборд.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[7]: Пердача HBitmap в другой процесс
От: AndrewJD США  
Дата: 13.03.08 11:00
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца.


Т.е. можно с помощью хака под конкретную платформу?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[7]: Пердача HBitmap в другой процесс
От: Pavel Dvorkin Россия  
Дата: 13.03.08 11:49
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца. А самый простой способ — через клипборд.


Да нельзя ничего через клипборд передавать! У юзера там doc — документ с embedded электронной таблицей хранится, а ты его затрешь!
With best regards
Pavel Dvorkin
Re[7]: Пердача HBitmap в другой процесс
От: Pavel Dvorkin Россия  
Дата: 13.03.08 11:52
Оценка:
Здравствуйте, Andrew S, Вы писали:

AS>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi,

там есть поле процесса-владельца.

Угу. А также поле, отвечающее за то, выбран он в каком-то контексте или нет. Потому что битовую карту можно только в одном контексте одновременно выбирать. И здесь ее выберут и там тоже. Весело будет...
With best regards
Pavel Dvorkin
Re[8]: Пердача HBitmap в другой процесс
От: Andrew S Россия http://alchemy-lab.com
Дата: 13.03.08 12:20
Оценка:
AS>>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi,
PD>там есть поле процесса-владельца.

PD>Угу. А также поле, отвечающее за то, выбран он в каком-то контексте или нет. Потому что битовую карту можно только в одном контексте одновременно выбирать. И здесь ее выберут и там тоже. Весело будет...


Зная user-win32_k структруы, это все не проблема... на уровне win32k объекты к процессу не привязаны. В общем, читайте мануалы, благо их есть.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Пердача HBitmap в другой процесс
От: Andrew S Россия http://alchemy-lab.com
Дата: 13.03.08 12:21
Оценка:
AS>>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца. А самый простой способ — через клипборд.

PD>Да нельзя ничего через клипборд передавать! У юзера там doc — документ с embedded электронной таблицей хранится, а ты его затрешь!


Передавать как раз можно А вот если подобный побочный эффект нежелателен — другое дело.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[8]: Пердача HBitmap в другой процесс
От: Andrew S Россия http://alchemy-lab.com
Дата: 13.03.08 12:22
Оценка:
AS>>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца.

AJD>Т.е. можно с помощью хака под конкретную платформу?


Можно. gdi-managed битмапы к процессу не привязаны, а только к сессии.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.