Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Вопросы API-программирования
Начать новую тему   Ответить на тему   вывод темы на печать

Вопросы API-программирования

Автор
Сообщение
Петрович
Ведущий банщик


Пол: Пол:Муж.
Зарегистрирован: 31.08.2005
Сообщения: 1392
Откуда: Сибирь...

Статус: Offline
СообщениеДобавлено: 2006.04.04 08:17.49
Ответить с цитатой
xdsl
Многоуважаемый вы наш. У меня к вам только 2 вопроса:
1. Почему вы никак не изволили отреагировать на мои вполне конкретно и корректно поставленные вопросы?
2. Вы читали название темы?

Человек приходит в тему про Windows и начинает периодически флудить замечаниями вроде: "Билла Гейтса выгнали из ВУЗА". При этом он целенаправленно мешает заинтересованным в программировании и саморазвитии людям общаться. Согласитесь со стороны это выглядит не очень?
Посмотреть профиль Отправить личное сообщение ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.04.04 19:56.22
Ответить с цитатой
Столь-же многоуважаемый Петрович
С трудом нашел о чем разговор. Ответом на второй - каюсь, поступил некорректно, надо было сразу сделать как vladislav - перевожу разговор в http://forum.shadrinsk.net/viewtopic.php?t=7292
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.04.04 20:44.21
Ответить с цитатой
поскольку тут таки спор зашел именно про апи-приграммирование я бы хотел получить ответы на свои вопросы. в ключе топика.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xdsl
просто хороший человек


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1252
Откуда: shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.04.04 21:03.41
Ответить с цитатой
И снова получить ярлык мракобеса, мешающего заинтересованным людям общаться? Общайтесь на здоровье друг с другом, эта тема - не моя, что было неоднократно озвучено, в том числе - и вами, уважаемый:
andy ice писал(а):
ты заметь - тебя сюда не звали
Не противоречьте хотя-бы самому себе. Кстати, прочитайте внимательно топик, вы найдете ответы на большинство ваших вопросов, а что не найдете - задайте еще раз, но уже в теме http://forum.shadrinsk.net/viewtopic.php?t=7292
Посмотреть профиль Отправить личное сообщение
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.04.04 21:06.27
Ответить с цитатой
копи-пасте в ту тему.
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Kuvyr.com
troppus



Зарегистрирован: 05.06.2006
Сообщения: 1


Статус: Offline
СообщениеДобавлено: 2006.06.05 11:17.14
Ответить с цитатой
Помогите, я хочу отловить событие "Закрытие окна" из своей библиотеки на VB. Как это можно сделать?
Посмотреть профиль Отправить личное сообщение
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2006.06.07 14:09.38
Ответить с цитатой
Вьюжл бейсик знаю туго, но не суть.
Окно чье? Если сам его ведешь - без проблем, пишешь в оконной процедуре (которая
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);
}
Вот. Но такое срабатывает только в том самом процессе, в котором окно было создано.
Если окно вообще не твое, у тебя один хендл, или даже хендла нет, так, косвенная информация, тогда надо хуками пользоваться. Но это долго объяснять, я сам в них недавно въехал.

Вот как это все на вьюжл-бейсике будет выглядеть - не знаю.
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
DCI
Освоившийся


Пол: Пол:Муж.
Зарегистрирован: 31.05.2006
Сообщения: 26
Откуда: Shadrinsk

Статус: Offline
СообщениеДобавлено: 2006.06.07 15:07.51
Ответить с цитатой
moishe
Хуки это в смысле ловушки на ObjectPascal или С++ пример с ними можно найти почти в любой конфе по программированию. Я уже давно ими пользуюсь для своего сниффера, ну и плюс еще кое что (на бывшей работе вынужден был писать для отслеживания действий пользователей, при установленном антивирусе и фаерволе).
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
pva
Освоившийся


Пол: Пол:Муж.
Зарегистрирован: 09.01.2005
Сообщения: 83


Статус: Offline
СообщениеДобавлено: 2006.06.24 20:26.14
Ответить с цитатой
У меня такой вопрос. Нужно передать данные по COM-порту. При этом на время передачи данных должен включаться передатчик. Передатчик включаю сигналом RTS. Вот фрагмент кода:

  EscapeCommFunction(FHandle,SetRTS);
  WriteFile(FHandle,BufTx[0],NTx,wr,Nil);

От момента установки сигнала RTS и началом передачи данных проходит от 1 до 10 мс. Меня такое время не устраивает. Нужно порядка хотя бы десятков микросекунд.
Вопрос. Как можно уменьшить это время?
Делаю это в отдельном процессе. Приоритет процесса менял - влияет, но не достаточно. Проблему решил аппаратно, но это не красиво, не удобно и не выгодно. Хотелось бы программно.
Посмотреть профиль Отправить личное сообщение ICQ Number
Рознин
troppus


Пол: Пол:Муж.
Зарегистрирован: 25.06.2006
Сообщения: 3


Статус: Offline
СообщениеДобавлено: 2006.06.25 10:42.40
Ответить с цитатой
Аппаратное решение - наилучшее, я не уверен, что программно в 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 позволит. А вообще, аппаратно - как раз то, что надо.
Посмотреть профиль Отправить личное сообщение
Рознин
troppus


Пол: Пол:Муж.
Зарегистрирован: 25.06.2006
Сообщения: 3


Статус: Offline
СообщениеДобавлено: 2006.06.25 11:04.44
Ответить с цитатой
А вот, такая еще идея в голову пришла.
При помощи SetCommState или SetCommConfig устанавливаешь аппаратный контроль потока, потом отправляешь данные WriteFile'ом (или TransmitCommChar'ом), и после этого устанавливаешь бит RTS. Как-бы теоретически данные должны пойти после установки бита. Не знаю, ты в компортах лучше меня разбираешься. Если надо, чтобы была какая-то пауза, пошли сначала некий нулевой блок, а в свойствах укажи "не отправлять нули", длину можно подобрать. Подойдет?
Посмотреть профиль Отправить личное сообщение
pva
Освоившийся


Пол: Пол:Муж.
Зарегистрирован: 09.01.2005
Сообщения: 83


Статус: Offline
СообщениеДобавлено: 2006.06.26 13:25.00
Ответить с цитатой
Нет. Не подойдет. При установке аппаратного управления потоком(RTS_CONTROL_ENABLE) сигнал RTS устанавливается сразу аппаратно при появлении данных в буфере передачи и ждет ответа от модема (CTS-готовность к передаче).
Здесь возникает другая проблема - отключения передатчика нужно делать по окончанию последнего стоп-бита: RTS сбрасывается намного позже окончания передачи (около 5мс. Почему - не знаю). Пробовал окончание передачи контролировать по событию EV_TXEMPTY, а затем сбрасывать RTS - тоже долго.
В общем, то, что мне надо, было реализовано в Windows NT/2000/XP добавлением в структуре DCB fRtsControl = RTS_CONTROL_TOGGLE. Это работает. А мне нужна совместимость с Win98.
Даже если работать с портами напрямую, переключение между процессами занимает много времени. Наверное только написанием своего драйвера можно заставить его быстро работать.
Кто-нибудь сам писал драйвер ? Как это делается ?
Посмотреть профиль Отправить личное сообщение ICQ Number
Рознин
troppus


Пол: Пол:Муж.
Зарегистрирован: 25.06.2006
Сообщения: 3


Статус: Offline
СообщениеДобавлено: 2006.06.28 12:52.49
Ответить с цитатой
Где-то валялась у меня инструкция по написанию драйверов под Виндовс. Но вообще-то в Вин98 легко можно избежать переключения контекста - просто запретив процессору обрабатывать прерывания. Я лично делал, получилось.

Запрет прерываний:
_asm {
    CLI
}
Разрешение прерываний:
_asm {
    STI
}
Между этими двумя конструкциями можно написать что угодно - выполнится подряд, без всяких переключений.
Посмотреть профиль Отправить личное сообщение
pva
Освоившийся


Пол: Пол:Муж.
Зарегистрирован: 09.01.2005
Сообщения: 83


Статус: Offline
СообщениеДобавлено: 2006.06.28 19:28.53
Ответить с цитатой
Рознин
Спасибо, попробую запрет прерываний в Вин98.
Цитата
Где-то валялась у меня инструкция по написанию драйверов под Виндовс

Найди, пожалуйста, мне пригодится.
Посмотреть профиль Отправить личное сообщение ICQ Number
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.06.28 21:06.22
Ответить с цитатой
pva
не вмешиваясь в ваше разговор замечу, что (обычно) все решения даже не касаясь драйверов, но на более низком уровне, чем простой ГУЙ, зачастую всегда идет в двух исполнениях - для win9x и для winNT (xp,2k,2k3 etc)
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
xapac
Писатель


Пол: Пол:Муж.
Зарегистрирован: 28.01.2006
Сообщения: 698


Статус: Offline
СообщениеДобавлено: 2006.08.04 19:44.39
Ответить с цитатой
Вот у меня есть окно хочу посредством TextOut написать на нем

когда пишу в WM_PAINT nтогда все работает,

но когда в каком нить другом месте, то не работает ,

вызываю тогда там где мне надо нарисовать
SendMessage(hWnd, WM_PAINT,0,0);

оно не ресует,
а если делаю

ShowWindow(hWnd,SW_HIDE);
ShowWindow(hWnd,SW_NORMAL);

тогда все нормально кто может помогите!
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора ICQ Number
andy ice
Militärmagazinkatze


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 23385


Статус: Offline
СообщениеДобавлено: 2006.08.04 23:55.41
Ответить с цитатой
дык. в паинте и надо писать. или я чет не понимаю в виапи
_________________
Ин дер гросен фамилие нихт клювен клац-клац Neutral
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Slin
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 17.12.2004
Сообщения: 1869


Статус: Offline
СообщениеДобавлено: 2006.08.07 06:53.47
Ответить с цитатой
xapac
Попробуй вместо SendMassage написать InvalidateRect(hwnd, NULL, TRUE);
Посмотреть профиль Отправить личное сообщение ICQ Number
xapac
Писатель


Пол: Пол:Муж.
Зарегистрирован: 28.01.2006
Сообщения: 698


Статус: Offline
СообщениеДобавлено: 2006.08.08 02:37.10
Ответить с цитатой
О... теперь работает!!
Благодарю...
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора ICQ Number
uav
Начинающий



Зарегистрирован: 08.11.2005
Сообщения: 6


Статус: Offline
СообщениеДобавлено: 2007.02.01 20:14.08
Ответить с цитатой
У меня такой вопрос.Как можно узнать информацию о дисках через API? Подскажите.
Посмотреть профиль Отправить личное сообщение
Vladislav_133
Old Programmer


Пол: Пол:Муж.
Зарегистрирован: 27.09.2006
Сообщения: 4502


Статус: Offline
СообщениеДобавлено: 2007.06.05 20:55.28
Ответить с цитатой
Какую конкретно информацию вы желаете узнать?
_________________
http://asm.shadrinsk.net
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
moishe
Заслуженный писатель


Пол: Пол:Муж.
Зарегистрирован: 25.11.2004
Сообщения: 1668


Статус: Offline
СообщениеДобавлено: 2007.06.06 08:36.59
Ответить с цитатой
uav, DeviceIOControl() много чего может сказать о дисках.

-------
А у меня такой вопрос возник: может ли приложение в Windows зафлудить систему сообщениями, и если нет, то каким образом система противостоит флуду?


#include <windows.h>

DWORD WINAPI SleepingThread(void *par) {
MSG msg;
PeekMessage(&msg,NULL,0,0,PM_NOREMOVE);
Sleep(INFINITE);
return(0);
}

int WINAPI WinMain(HINSTANCE hi,HINSTANCE prhi,LPSTR cmd,int ncmd) {
DWORD thr_id;
CreateThread(NULL,0,SleepingThread,NULL,0,&thr_id);
while(1) PostThreadMessage(thr_id,WM_USER,0,0);
return(0);
}
Как вариант, можно в SleepingThread вместо Sleep() сделать PeekMessage(...,PM_NOREMOVE) в вечном цикле.
Что система с этим будет делать? Вопрос для меня не праздный.

Добавлено спустя 28 минут 51 секунду:

Пожалуй, это приложение способно зафлудить разве что само себя. Справку почитал - в Windows есть системная очередь сообщений и есть своя для каждого трида (если создаст). PostThreadMessage ставит сообщение в тридовскую очередь минуя системную.

Но вот еще вариант. Прямо в WinMain без всяких доп.тридов пишем:
while(1) PostMessage(HWND_BROADCAST,WM_USER,0,0);

И вопрос: может ли приложение как-то поставить сообщение в системную очередь?
Если нельзя - тогда, в принципе, механизм антифлуда понятен. А если можно?
Посмотреть профиль Отправить личное сообщение Отправить e-mail ICQ Number
Страница 5 из 5
Начать новую тему   Ответить на тему   вывод темы на печать
На страницу Пред.  1, 2, 3, 4, 5
Показать сообщения:   
Список форумов Шадринский форум -> Программирование -> Общие вопросы программирования -> Вопросы API-программирования

 
Перейти: 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы