Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: vlary
Дата сообщения: 07.11.2011 20:24
bomzzz Почитай это: Ссылка Может, что-то прояснится.
Автор: Abs62
Дата сообщения: 07.11.2011 20:32
bomzzz

Цитата:
пришло сообщение WM_QUERYENDSESSION окно запускает тред завершающий обработку и сбрасывающие данные на диск.

Зачем? Программа по идее здесь должна только ответить, можно системе завершаться или нет.
Идеология работы системы такова:
Сначала система рассылает сообщения WM_QUERYENDSESSION, запрашивая все ли программы готовы к закрытию. А после этого посылает WM_ENDSESSION, сообщая, решила она завершаться или нет (смотри wParam). И вот в обработчике WM_ENDSESSION и должно пройти всё завершение работы без лишних вопросов. Как только обработчик отработал - всё, программа завершена. Так что запуск отдельного потока здесь как не пришей кобыле хвост.
Автор: bomzzz
Дата сообщения: 07.11.2011 20:33
это я прочитал - единственное что есть на русском , ниче не прояснилось.

Добавлено:

Цитата:
Как только обработчик отработал - всё, программа завершена.

говорю же не завершается. на практике проверено

Добавлено:
WM_QUERYENDSESSION - как только на это ответил единица все дальше ниче не происходит. можно сделать только так на WM_QUERYENDSESSION закончить приложение и ответить 0 - пошло дальше

Добавлено:

Цитата:
запуск отдельного потока здесь как не пришей кобыле хвост.

приложение так работает, пришей не пришей от этого никуда не деться

Добавлено:
а блин ступил - вернуть то 1 надо.
вот работает

Цитата:

    .ELSEIF uMsg == WM_QUERYENDSESSION

            mov eax, 1
            ret

    .ELSEIF uMsg == WM_ENDSESSION
            mov SHUTDOWNFLAG, 9988
            mov eax,offset EXITProc
            invoke CreateThread,NULL,NULL,eax,0,0,addr ThreadID1
            mov ThreadID1, eax
            invoke CloseHandle, ThreadID1
            invoke Sleep, 5000


или так без разницы

Цитата:

    .ELSEIF uMsg == WM_QUERYENDSESSION
            mov SHUTDOWNFLAG, 9988
            mov eax,offset EXITProc
            invoke CreateThread,NULL,NULL,eax,0,0,addr ThreadID1
            mov ThreadID1, eax
            invoke CloseHandle, ThreadID1
            invoke Sleep, 5000
            mov eax, 1
            ret
Автор: Abs62
Дата сообщения: 07.11.2011 20:57
bomzzz

Цитата:
приложение так работает, пришей не пришей от этого никуда не деться

Месье знает толк в извращениях.
Тогда хоть жди завершения потока через WaitForSingleObject, а не через Sleep. Лишних тормозов не будет.
Автор: bomzzz
Дата сообщения: 07.11.2011 21:00
ага идея, а то думал еще один флаг влепить. пока добился что вообще работает.
ну а как без треда сделать интернет может зависнуть - представь браузер страница зависла и ни одна кнопка не отвечает
Автор: Molniev
Дата сообщения: 07.11.2011 21:33

Цитата:
ну а как без треда сделать интернет может зависнуть - представь браузер страница зависла и ни одна кнопка не отвечает

Что вы хотите этим сказать?
Автор: bomzzz
Дата сообщения: 07.11.2011 21:40
ну я бы тебе на даунлоад мастере показал, да в последних версиях исправили по заявкам радиослушателей, как окно зависает
Автор: Molniev
Дата сообщения: 07.11.2011 21:47
Я имею в виду, что мешает использовать ассинхронный/неблокирующий ввод-вывод?
Автор: bomzzz
Дата сообщения: 07.11.2011 21:56
ассинхронный и есть тред. сейчас с ходу уже не могу вспомнить почему меня ассинхронный не устроил, но если писать на слотах все равно не обойтись без треда - от варианта слотов пришлось отказаться потому что я не был уверен, что обеспечил все необходимое для обработки хттп протокола. но в любом случае - окно это просто картинка с кнопашками, и если еще на все кнопки обработку вешать оно постоянно подвисать будет, а если все на тредах сделать картинка отлично работкает
Автор: bomzzz
Дата сообщения: 08.11.2011 01:27
Abs62

Цитата:

    .ELSEIF uMsg == WM_QUERYENDSESSION
            mov eax, 1
            ret

    .ELSEIF uMsg == WM_ENDSESSION
            mov SHUTDOWNFLAG, 9988
            mov eax,offset EXITProc
            invoke CreateThread,NULL,NULL,eax,0,0,addr ThreadID1
            mov ThreadID1, eax
            ;invoke CloseHandle, ThreadID1
            ;invoke Sleep, 5000
            invoke WaitForSingleObject,ThreadID1,5000
            invoke WaitForSingleObject,ThreadID,5000



отлично работкаит даже на моем иде винте 2 мб спуливает незаметно для выключения

Добавлено:
только вот такой прикол - система ждет так не больше чем указано в реестре ждать и больше 60 мб оно так спулить не успевает. а вот если все сделать в WM_QUERYENDSESSION тогда ждет ровно столько сколько надо - но тогда если приложение зависнет и винда не выключиться

Добавлено:
еще такая фигня в лпараметре передается причина системной остановки и одна из причин LOGOFF, когда меняешь юзера прогрмаммы не закрываются, и не смотря на отсутствие проверки по поводу причины на смену юзера так тоже не останавливается приложение
Автор: bomzzz
Дата сообщения: 10.11.2011 10:47
никто не знает как LOGOFF вызвать, у меня правда пользователь всего один может поэтому - получается только через эмуляцию нажатия WINDOWS+L ???
Автор: Abs62
Дата сообщения: 10.11.2011 16:10
bomzzz
ExitWindowsEx с флагом EWX_LOGOFF.
Автор: bomzzz
Дата сообщения: 10.11.2011 19:13
значит у меня чета октлючена. спс

Добавлено:
http://zalil.ru/32032645
перезагрузка происходит. может из за того что пользователь один. win+l работает
Автор: Abs62
Дата сообщения: 10.11.2011 19:37
bomzzz

Цитата:
win+l работает

Тогда смотри функцию LockWorkStation - по Win+L она и вызывается.

PS. Только имей в виду, что это не logoff - это именно блокировка сеанса.
Автор: bomzzz
Дата сообщения: 10.11.2011 19:41
щас попробую, но я вроде пробовал это

Добавлено:
гыгы , работкаит!
спасипки. как то криво гуглил наверно

Добавлено:
а вот в чем дело - я неправильно думал как это называется. в винде написано "смена пользователя" ну я и подумал что это лог оф

Добавлено:
странно вот эта кнопка работает, а логофф нет


Цитата:

invoke RtlAdjustPrivilege,13h,1h,0h,esp
invoke ExitWindowsEx, EWX_REBOOT OR EWX_FORCEIFHUNG, 0
Автор: Abs62
Дата сообщения: 10.11.2011 23:31
bomzzz

Цитата:
invoke ExitWindowsEx, EWX_REBOOT OR EWX_FORCEIFHUNG, 0

Дык, ребут - он и в Африке ребут. Выход - это EWX_LOGOFF.
Автор: bomzzz
Дата сообщения: 10.11.2011 23:43
Автор: bomzzz
Дата сообщения: 18.11.2011 02:12
никто не делал на сокетах хттп прокси? чета не получается.
имеется ввиду чтоб запросы через прокси шли, сокс5 легко делается, а вот хттп чушь какая то
Автор: Molniev
Дата сообщения: 18.11.2011 18:23
В чем чушь то? Спецификацию HTTP прочесть надо соответствующий раздел и сразу станет понятно, что http-proxy получает тот же запрос что и http сервер, по полю host определяет кому запрос, пересылает его и возвращает полученный ответ. Все просто настолько, насколько просто вообще быть может.
Автор: bomzzz
Дата сообщения: 18.11.2011 18:26
я не нашел ни единого примера в инете ни на дельфи ни на си.
то есть ип адрес указать прокси сервера, а в поле хост указать адрес хттп сервера. попробую сенкс.
Автор: Molniev
Дата сообщения: 18.11.2011 18:36
Примеры тоже кстати есть. В разнообразии.
Только не понятно зачем? Есть RFC в котором все это очень подробно описано. Я скажу больше, конкретно эта RFC даже перевод на русский имеет.

Цитата:
то есть ип адрес указать прокси сервера

Любой сетевой адрес/доменное имя/samba имя, через которой программка использующая прокси сможет связаться с вашим сервером

Цитата:
поле хост указать адрес хттп сервера

Укажет программа, использующая ваш прокси. А вам нужно будет по этому ip/dns name (как правило) установить соединение и переслать запрос. А потом ответ. И закрыть оба соединения.
Автор: bomzzz
Дата сообщения: 18.11.2011 18:43
значит неправильно гуглил, сокс5 легко нашел и сделал. а хттп искал искал ниче не нашел
Автор: bomzzz
Дата сообщения: 19.11.2011 20:07

Цитата:
вот сейчас могу точно сказать, почему ИЕ библиотека не устраивает, не асинхронный а вообще, если принудительно прибить соединение в большинстве случаев процесс использующий библиотеку ИЕ для интернета начинает жрать 100% процессора. на сокетах такого не бывает


никто не знает как сделать, чтоб системное меню окна вызывалось не (только) по ALT+SPACE а по другой горячей клавише?
Автор: Molniev
Дата сообщения: 20.11.2011 12:13
bomzzz
1. Поискать соответствующий WM_*
2. В оконной процедуре перед DefWindowProc править свое сочетание клавиш на ALT+SPACE.
Автор: bomzzz
Дата сообщения: 20.11.2011 12:42

Цитата:
Поискать соответствующий WM_*

не могу найти

Цитата:
В оконной процедуре перед DefWindowProc править свое сочетание клавиш на ALT+SPACE.

это все что в голову пришло, но как то не очень, хуже только сэмулировать нажатие мыши в угол окна
Автор: Abs62
Дата сообщения: 20.11.2011 13:13
bomzzz

Цитата:
не могу найти

WM_SYSCOMMAND + SC_KEYMENU
Автор: bomzzz
Дата сообщения: 20.11.2011 13:17
разве это не наоборот - когда с меню манипулируешь такое сообщение приходит окну. то есть меню само по себе открывается
Автор: Abs62
Дата сообщения: 20.11.2011 13:25
bomzzz
Само по себе ничего не бывает. Читай MSDN.

Цитата:
An application can carry out any system command at any time by passing a WM_SYSCOMMAND message to DefWindowProc.
Автор: bomzzz
Дата сообщения: 20.11.2011 13:28
ну я попробовал уже не открывается.

http://vsokovikov.narod.ru/New_MSDN_API/Accel_kbd/notify_wm_syscommand.htm

Окно получает это сообщение тогда, когда пользователь выбирает команду из Системного меню окна (прежде известное как системное или управляющее меню) или когда пользователь выбрал кнопку развертывания, свертывания, восстановления или закрытия окна.

Добавлено:
я туда пункт добавил - чтоб из за одного пункта меню не городить, и так как меню другого нету хотел к ALT+SPACE добавить F10. и вот когда мой пункт меню выбирается как раз это сообщение приходит. то есть меню само по себе обслуживается системой, а по результату манипуляций с ним приходит приложению. это соопчение
Автор: Abs62
Дата сообщения: 20.11.2011 13:51
bomzzz

Цитата:
ну я попробовал уже не открывается.

Что пробовал-то? Вот так всё вызывается.

Код: DefWindowProc(hWnd,WM_SYSCOMMAND,SC_KEYMENU,' ');

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.