Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как послать сообщение окну из сервиса  (Прочитано 18061 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 18-04-2006 07:18 » 

Из окна в сервис передаю его HWND, все передается правильно, HWND окна не меняется, но когда пытаюсь послать сообщение
PostMessage(*m_phWnd, WM_USER+1, 0, 0);
Получаю error 1400 - ERROR_INVALID_WINDOW_HANDLE

Как  это можно побороть?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
doublebug
Гость
« Ответ #1 : 18-04-2006 08:34 » 

Окно нужно искать через FindWindow или FindWindowEx.
Я так понял что хендл из другого процесса передается?
Хендлы привязаны к процессу потому и не работает
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 19-04-2006 05:21 » 

А вот если такой момент? Есть СОМ-компонент и у него есть метод для отображения на окне (это для СОМ-компонента вообще-то не совсем правильно, но как есть). Может ли клиент, подсоединяясь к СОМ-компоненту передать ему хендл своего окна, чтобы этот компонент рисовал на его морде. В Связи с прошлым вопросм стоит добавить, что СОМ-сервер - InProcServer, т.е. длл-ка. Хотелось бы все-таки уточнить возможно ли будет передать хендл окна. Хендл окна будет передаваться через аргумент функции. В длл я как-то уже передавал хендл окна и было все ОК, хотелось бы узнать не столкнусь ли я с проблемами, при использовании СОМ.
Записан

ещё один вопрос ...
zubr
Гость
« Ответ #3 : 19-04-2006 07:34 » 

Цитата
Из окна в сервис передаю его HWND, все передается правильно, HWND окна не меняется, но когда пытаюсь послать сообщение
PostMessage(*m_phWnd, WM_USER+1, 0, 0);
Получаю error 1400 - ERROR_INVALID_WINDOW_HANDLE

Как  это можно побороть?
Под каким пользователем запущен сервис? Скорее всего под системным аккаунтом... Тогда естественно он передавать сообщения в пользовательский аккаунт не сможет. Я в подобных ситуациях из сервиса работающего в режиме автозапуска, устанавливал хук, в котором определял заражаемый процесс и если это explorer.exe (оболочка), запускал из него свою прогу, которая уже будет работать в юзерском режиме.
Записан
doublebug
Гость
« Ответ #4 : 19-04-2006 10:41 » 

Цитата
А вот если такой момент? Есть СОМ-компонент и у него есть метод для отображения на окне (это для СОМ-компонента вообще-то не совсем правильно, но как есть). Может ли клиент, подсоединяясь к СОМ-компоненту передать ему хендл своего окна, чтобы этот компонент рисовал на его морде. В Связи с прошлым вопросм стоит добавить, что СОМ-сервер - InProcServer, т.е. длл-ка. Хотелось бы все-таки уточнить возможно ли будет передать хендл окна. Хендл окна будет передаваться через аргумент функции. В длл я как-то уже передавал хендл окна и было все ОК, хотелось бы узнать не столкнусь ли я с проблемами, при использовании СОМ.
В принципе все должно работать. Но нюансы есть.
Лучше всего чтоб компонент создавался в том же потоке что и окно.
Какая поточная модель у компонента?
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 19-04-2006 12:12 » 

Цитата
Лучше всего чтоб компонент создавался в том же потоке что и окно.
ОК.
Цитата
Какая поточная модель у компонента?
А какие бывают?
Записан

ещё один вопрос ...
doublebug
Гость
« Ответ #6 : 19-04-2006 12:25 » 

Цитата
Какая поточная модель у компонента?
А какие бывают?
Single - Компонент создается в дефолтном апартаменте (тот который первым проинитил однопоточный апартамент)
  в приложении всегда один.
Apartment - однопоточный. Может быть несколько таких апартаментов
Free - много поточный. Всегда один
Both (Apartment + Free) тоже много поточный но может работать и в Apartment.
Neutral (Win 2000+) тоже многопоточный. Впринципе может работать в любом апартаменте.

ГУевые компоненты как правило однопоточные. т.е. Apartment threaded.

Для подробностей есть статья
http://www.rsdn.ru/article/com/COM_TnC/COM_TnC.xml
в оглавлении смотреть "Контексты и апартаменты"
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 19-04-2006 12:31 » 

Почитаю и тогда отвечу на твой вопрос, не гарантирую, что прочитаю сегодня, но в ближайшие день-два.
Записан

ещё один вопрос ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines