xdsl
Многоуважаемый вы наш. У меня к вам только 2 вопроса: 1. Почему вы никак не изволили отреагировать на мои вполне конкретно и корректно поставленные вопросы? 2. Вы читали название темы? Человек приходит в тему про Windows и начинает периодически флудить замечаниями вроде: "Билла Гейтса выгнали из ВУЗА". При этом он целенаправленно мешает заинтересованным в программировании и саморазвитии людям общаться. Согласитесь со стороны это выглядит не очень? |
Столь-же многоуважаемый Петрович
С трудом нашел о чем разговор. Ответом на второй - каюсь, поступил некорректно, надо было сразу сделать как vladislav - перевожу разговор в http://forum.shadrinsk.net/viewtopic.php?t=7292 |
поскольку тут таки спор зашел именно про апи-приграммирование я бы хотел получить ответы на свои вопросы. в ключе топика. _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
И снова получить ярлык мракобеса, мешающего заинтересованным людям общаться? Общайтесь на здоровье друг с другом, эта тема - не моя, что было неоднократно озвучено, в том числе - и вами, уважаемый: andy ice писал(а): ты заметь - тебя сюда не звали |
копи-пасте в ту тему. _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
Помогите, я хочу отловить событие "Закрытие окна" из своей библиотеки на VB. Как это можно сделать? |
Вьюжл бейсик знаю туго, но не суть.
Окно чье? Если сам его ведешь - без проблем, пишешь в оконной процедуре (которая WindowProc(HWND wnd,UINT mes,WPARAM wp,LPARAM lp), в классе задается) switch(mes) { ... case WM_CLOSE: { <твой_код> (то есть реагируешь на сообщение WM_CLOSE); break;} ... } Если ты его создал, имеешь хендл (hwnd), но о его классе без понятия, можно воспользоваться OldWndProc=(WNDPROC)GetWindowLong(hwnd,GWL_WNDPROC); она вернет тебе адрес его оконной процедуры, которая все сообщения обрабатывает, делаешь свою оконную процедуру MyWndProc(HWND wnd,UINT mes,WPARAM wp,LPARAM lp); ее адрес подставляешь окну при помощи SetWindowLong(hwnd,GWL_WNDPROC,(long)MyWndProc); а в ней самой опять же реагируешь на WM_CLOSE, а все прочие сообщения пересылаешь старой процедуре MyWndProc(HWND wnd,UINT mes,WPARAM wp,LPARAM lp) { if(mes==WM_CLOSE) { <твой_код> return(0); //чтобы окошко не закрылось } return OldWndProc(wnd,mes,wp,lp); } Вот. Но такое срабатывает только в том самом процессе, в котором окно было создано. Если окно вообще не твое, у тебя один хендл, или даже хендла нет, так, косвенная информация, тогда надо хуками пользоваться. Но это долго объяснять, я сам в них недавно въехал. Вот как это все на вьюжл-бейсике будет выглядеть - не знаю. |
moishe
Хуки это в смысле ловушки на ObjectPascal или С++ пример с ними можно найти почти в любой конфе по программированию. Я уже давно ими пользуюсь для своего сниффера, ну и плюс еще кое что (на бывшей работе вынужден был писать для отслеживания действий пользователей, при установленном антивирусе и фаерволе). |
У меня такой вопрос. Нужно передать данные по COM-порту. При этом на время передачи данных должен включаться передатчик. Передатчик включаю сигналом RTS. Вот фрагмент кода:
От момента установки сигнала RTS и началом передачи данных проходит от 1 до 10 мс. Меня такое время не устраивает. Нужно порядка хотя бы десятков микросекунд. Вопрос. Как можно уменьшить это время? Делаю это в отдельном процессе. Приоритет процесса менял - влияет, но не достаточно. Проблему решил аппаратно, но это не красиво, не удобно и не выгодно. Хотелось бы программно. |
Аппаратное решение - наилучшее, я не уверен, что программно в Windows такой короткий интервал вообще достижим.
Сам смотри: устанавливаешь бит RTS сисвызовом, дальше: 1) из него нужно вернуться (из сисвызова); 2) поместить в стек 5 параметров; 3) вызвать WriteFile, которая находится в kernel32.dll; дальше, WriteFile должна: 4) извлечь из стека 5 параметров; 5) разыменовать FHandle, определить, что это СОМ-порт; 6) определить адрес драйвера СОМ-порта; 7) поместить в стек сколько-то параметров; 8) вызвать драйвер; дальше, драйвер должен: 9) извлечь параметры из стека; 10) проверить состояние СОМ-порта; 11) проверить свободность буфера; 12) записать данные в буфер; 13) послать контроллеру команду отправки данных, то есть записать число в порт ввода-вывода и сгенерировать прерывание СОМ-порта; дальше: 14) процессор должен обработать прерывание, разрешить контроллеру отправку данных; 15) при этом процессор забирает данные из буфера и перенаправляет их контроллеру через порт; 16) наконец, контроллер реально начинает отправку данных. Уф... И все это за 10 микросекунд? Даже если процесс ни разу не прервется переключением контекста, и то тяжело успеть. Попробуй непосредственное управление контроллером, если конечно Windows позволит. А вообще, аппаратно - как раз то, что надо. |
А вот, такая еще идея в голову пришла.
При помощи SetCommState или SetCommConfig устанавливаешь аппаратный контроль потока, потом отправляешь данные WriteFile'ом (или TransmitCommChar'ом), и после этого устанавливаешь бит RTS. Как-бы теоретически данные должны пойти после установки бита. Не знаю, ты в компортах лучше меня разбираешься. Если надо, чтобы была какая-то пауза, пошли сначала некий нулевой блок, а в свойствах укажи "не отправлять нули", длину можно подобрать. Подойдет? |
Нет. Не подойдет. При установке аппаратного управления потоком(RTS_CONTROL_ENABLE) сигнал RTS устанавливается сразу аппаратно при появлении данных в буфере передачи и ждет ответа от модема (CTS-готовность к передаче).
Здесь возникает другая проблема - отключения передатчика нужно делать по окончанию последнего стоп-бита: RTS сбрасывается намного позже окончания передачи (около 5мс. Почему - не знаю). Пробовал окончание передачи контролировать по событию EV_TXEMPTY, а затем сбрасывать RTS - тоже долго. В общем, то, что мне надо, было реализовано в Windows NT/2000/XP добавлением в структуре DCB fRtsControl = RTS_CONTROL_TOGGLE. Это работает. А мне нужна совместимость с Win98. Даже если работать с портами напрямую, переключение между процессами занимает много времени. Наверное только написанием своего драйвера можно заставить его быстро работать. Кто-нибудь сам писал драйвер ? Как это делается ? |
Где-то валялась у меня инструкция по написанию драйверов под Виндовс. Но вообще-то в Вин98 легко можно избежать переключения контекста - просто запретив процессору обрабатывать прерывания. Я лично делал, получилось.
Запрет прерываний:
|
Рознин
Спасибо, попробую запрет прерываний в Вин98. Цитата Где-то валялась у меня инструкция по написанию драйверов под ВиндовсНайди, пожалуйста, мне пригодится. |
pva
не вмешиваясь в ваше разговор замечу, что (обычно) все решения даже не касаясь драйверов, но на более низком уровне, чем простой ГУЙ, зачастую всегда идет в двух исполнениях - для win9x и для winNT (xp,2k,2k3 etc) _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
Вот у меня есть окно хочу посредством TextOut написать на нем
когда пишу в WM_PAINT nтогда все работает, но когда в каком нить другом месте, то не работает , вызываю тогда там где мне надо нарисовать SendMessage(hWnd, WM_PAINT,0,0); оно не ресует, а если делаю ShowWindow(hWnd,SW_HIDE); ShowWindow(hWnd,SW_NORMAL); тогда все нормально кто может помогите! |
дык. в паинте и надо писать. или я чет не понимаю в виапи _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
xapac
Попробуй вместо SendMassage написать InvalidateRect(hwnd, NULL, TRUE); |
О... теперь работает!!
Благодарю... |
У меня такой вопрос.Как можно узнать информацию о дисках через API? Подскажите. |
Какую конкретно информацию вы желаете узнать? _________________ http://asm.shadrinsk.net |
uav, DeviceIOControl() много чего может сказать о дисках.
------- А у меня такой вопрос возник: может ли приложение в Windows зафлудить систему сообщениями, и если нет, то каким образом система противостоит флуду?
Что система с этим будет делать? Вопрос для меня не праздный. Добавлено спустя 28 минут 51 секунду: Пожалуй, это приложение способно зафлудить разве что само себя. Справку почитал - в Windows есть системная очередь сообщений и есть своя для каждого трида (если создаст). PostThreadMessage ставит сообщение в тридовскую очередь минуя системную. Но вот еще вариант. Прямо в WinMain без всяких доп.тридов пишем: while(1) PostMessage(HWND_BROADCAST,WM_USER,0,0); И вопрос: может ли приложение как-то поставить сообщение в системную очередь? Если нельзя - тогда, в принципе, механизм антифлуда понятен. А если можно? |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы |