Привет всем!!! У мя такая ситуация есть процесс А и процесс Б, нада чтоб процесс А послал запрос процессу Б, а на это процесс Б должен сформировать картинку 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
);
Может еще есть какието вариатны Предачи изображения медлу процессами, напишите плиз. Может ктот занималься этим.Заранее благодарен!!!
Здравствуйте, 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."
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 — это хендел, т.е. указатель на обьект "Изображение".
В самом обьекте храниться информация о размере данного обьекта и др. дополнительные данные.
Получите в приложении "Б" массив пикселей картинки, к примеру как указано тут
и передайте этот массив байт через тотже пайп, который вы умеете уже использовать.
В приложении "А" из этого массива данных и доп. данных востановите изображение (HBitmap).
Здравствуйте, pjBrain, Вы писали:
B>HBitmap — это хендел, т.е. указатель на обьект "Изображение". B>В самом обьекте храниться информация о размере данного обьекта и др. дополнительные данные. B>Получите в приложении "Б" массив пикселей картинки, к примеру как указано тут
и передайте этот массив байт через тотже пайп, который вы умеете уже использовать. 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 реальный
Пасиб за ответ!!
Здравствуйте, Druidoff, Вы писали:
D>А если передевать контекст устройства HDC D>Ну типа D>DC=getDC(0); D>BitBlt(DC, X, Y, cX, cY, TempDC, 0, 0, SRCCOPY)
D>TempDC — перередать в другой процесс, или тож возникает тажае проблема!! D>Может есть еще какието варианты!!
сделай DIB-секцию через CreateDIBSection с хэндлом разделяемой памяти — вот последний и можно дублировать, и передавать в другие процессы после этой процедуры
Здравствуйте, 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 с хэндлом разделяемой памяти — вот последний и можно дублировать, и передавать в другие процессы после этой процедуры
Можно тупой вопрос Что такое "хэндлом разделяемой памяти"?
Здравствуйте, 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, то там все будет описано — что за хэндл и с чем его есть.
D>>А если передевать контекст устройства HDC
AJD>Перестань фигней страдать. Ясно же написали — GDI обьекты НЕЛЬЗЯ передовать между процессами. Передавай сами данные в виде массива
На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца. А самый простой способ — через клипборд.
Здравствуйте, Andrew S, Вы писали:
AS>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца.
Т.е. можно с помощью хака под конкретную платформу?
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Здравствуйте, Andrew S, Вы писали:
AS>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца. А самый простой способ — через клипборд.
Да нельзя ничего через клипборд передавать! У юзера там doc — документ с embedded электронной таблицей хранится, а ты его затрешь!
Здравствуйте, Andrew S, Вы писали:
AS>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi,
там есть поле процесса-владельца.
Угу. А также поле, отвечающее за то, выбран он в каком-то контексте или нет. Потому что битовую карту можно только в одном контексте одновременно выбирать. И здесь ее выберут и там тоже. Весело будет...
AS>>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, PD>там есть поле процесса-владельца.
PD>Угу. А также поле, отвечающее за то, выбран он в каком-то контексте или нет. Потому что битовую карту можно только в одном контексте одновременно выбирать. И здесь ее выберут и там тоже. Весело будет...
Зная user-win32_k структруы, это все не проблема... на уровне win32k объекты к процессу не привязаны. В общем, читайте мануалы, благо их есть.
AS>>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца. А самый простой способ — через клипборд.
PD>Да нельзя ничего через клипборд передавать! У юзера там doc — документ с embedded электронной таблицей хранится, а ты его затрешь!
Передавать как раз можно А вот если подобный побочный эффект нежелателен — другое дело.
AS>>На самом деле, можно. В вин9х. В NT тоже можно, если очень хочется. Правда, для этого надо немного знать структуру объектов gdi, там есть поле процесса-владельца.
AJD>Т.е. можно с помощью хака под конкретную платформу?
Можно. gdi-managed битмапы к процессу не привязаны, а только к сессии.