Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
slavokhire5
Прорезались зубы
Сообщения: 202
Зарегистрирован: Пн сен 26, 2011 13:48:25
Откуда: Харьков

Re: Вопросы по С/С++ (СИ)

Сообщение slavokhire5 »

UIP_UDP задан нулевым

почему нулевым?
#define UIP_CONF_UDP 1
соответственно:

#ifdef UIP_CONF_UDP // да, такой дефайн есть
#define UIP_UDP UIP_CONF_UDP // теперь UIP_UDP будет равен UIP_CONF_UDP, т.е. единице
#else /* UIP_CONF_UDP */
#define UIP_UDP 0
#endif /* UIP_CONF_UDP */

или я все неправильно понимаю?
Осилит дорогу идущий
--------------------------
Пишу на Си за еду
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение WiseLord »

Вообще, я бы делал как-то так:

uip-conf.h:

Код: Выделить всё

#define UIP_CONF_UDP

uipopt.h:

Код: Выделить всё

#ifdef UIP_CONF_UDP
#define UIP_UDP
#endif

Код:

Код: Выделить всё

#if UIP_UDP
...
#endif

Мне кажется, так нагляднее и более однозначно. Хотя, в целом, UIP_UDP как бы лишний, и можно было бы обойтись одним изначальным UIP_CONF_UDP.

Назначать какие-то значения этим макросам (1 или 0) смысла особого нет, т.к. задача здесь стоит лишь во включении/выключении частей кода. Поэтому можно обычными #define и #ifdef обойтись, без присваивания макросам значений.
Последний раз редактировалось WiseLord Чт июл 09, 2015 10:31:00, всего редактировалось 1 раз.
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

Siarzhuk писал(а):Пришлите линк на длл в личку

да вот тут все есть, даже исходник ее
http://www.moetronix.com/ae4jy/pskcoredll.htm
в пдф страница 24

ARV писал(а):и при помощи обычного switch-а и обрабатывается.

а я прочел, что так не стоит делать
типа лучше использовать мфц

вобщем я вспомнил про getmessage
была обертка в purebasic, на плюсах я с этим не работал, поэтому не могу найти образец кода для этого дела

Siarzhuk писал(а):По идее перед этим длл-ке указывается либо HWND окна, id потока либо указатель на функцию-callback в которую всё это будет отсылаться.

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

и как передаются параметры в функции обратного вызова? там же она без скобок указывается
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

kalobyte писал(а):
ARV писал(а):и при помощи обычного switch-а и обрабатывается.

а я прочел, что так не стоит делать
типа лучше использовать мфц
MFC это всего лишь обертка системных вызовов, обработка сообщений все равно switch-ем ведется.
Вы спрашиваете "как обработать" - я отвечаю, как. Ваша программа из DLL получает сообщение? значит, она должна его обработать.
kalobyte писал(а):и что мне выбрать? допустим у меня будет визуальное приложение
хвнд куда писать?
или вы собираетесь при помощи DLL сами сообщение посылать? вас понять нельзя.
если вы посылаете сообщение - вы обязаны знать, КОМУ. вот его HWND и пишите - это параметр функции sendmessage
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а): и что мне выбрать? допустим у меня будет визуальное приложение хвнд куда писать?

Первая-же функция инициализации:

fnStartSoundCard

long __stdcall fnStartSoundCard(HWND hWnd, long cardnum, long numRXchannels );

Parameters:
hWnd - A Handle to the Window that is to receive the DLL's messages.
[...]

Вот хэндл главного окошка контролирующей программы туда и шлём. А потом уже в этом окне обрабатываем сообщения соответственно заморочкам используемого фреймворка.

kalobyte писал(а):и как передаются параметры в функции обратного вызова? там же она без скобок указывается

А её прототип определяется заранее или типом указателя на эту функцию или в документации - изнасиловав компилятор прямым приведением типа конечно можно будет заставить принять callback с другими параметрами - но если модуль угораздит вызвать такой callback - винегрет после взрыва будет не только на полу, но и на стенах с потолком.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

ARV писал(а):MFC это всего лишь обертка системных вызовов, обработка сообщений все равно switch-ем ведется.

Ну там не совсем switch - а изощрённая схема с мапами обработчиков, размазанными по дереву наследования, в беготне по которым снизу-вверх и проходит жизнь MFC-шного приложения.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

хер вас разберет
Siarzhuk писал(а):Вот хэндл главного окошка контролирующей программы туда и шлём.

откуда он берется? я специальной прогой видел их, но это просто какие-то числа и все
в коде откуда я узнаю?
это результат работы какой-то функции типа создания главного окна или что?
Siarzhuk писал(а):А её прототип определяется заранее или типом указателя на эту функцию


ты не понял
вот я обычно вызываю функцию foo("aaa",12);
у нее 2 аргумента
если это будет функция обратного вызова, то имя этой функции есть аргумент в функции, которая срабатывает например по таймеру
как мне передать ааа и 12 в ту функцию, если в коде оно записывается типа settimer(1,foo); и срабатывает он типа каждую секунду
или допускается писать скобки с параметрами? :shock:

это я отдельно от моего вопроса, раз уж зашла речь о функции обратного вызова

забывал совсем
как в студии 2013 отключить создание 30мб файла типа Win32Project1.sdf
нахер он нужен? и вообще как отключить всякий ненужный мусор? а то много времени на компиляцию уходит

я создал образцовый с++ проект
там окно и менюшка есть file about

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

вот этот дескриптор что ли?
типа вот так он используется
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

ну тогда я боле менее понял
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а):
Siarzhuk писал(а):Вот хэндл главного окошка контролирующей программы туда и шлём.

откуда он берется? [...] это результат работы какой-то функции типа создания главного окна или что?

В MFC например это член m_hWnd классa-наследника CWnd. В общем случае, хвала плюсам, достаточно неявно припахать operator HWND() прямо присвоив *this. Ну или закат/рассвет солнца вручную путём вызова ::CreateWindow вернёт оный хэндл для свежесозданного.

kalobyte писал(а):
Siarzhuk писал(а):А её прототип определяется заранее или типом указателя на эту функцию

ты не понял

Бремя вины непонимания априорно висит на нуждающемся а не на том, кто снизошёл, даже если последний и не прав. Дзе бухло за брудершафт? :-D

kalobyte писал(а):вот я обычно вызываю функцию foo("aaa",12);
у нее 2 аргумента
если это будет функция обратного вызова,

... то это уже будет "не твой зуб, а их". Т.е. вызываать будут её - а твоё дело в этой самой функции слушать чего говорят.

kalobyte писал(а):то имя этой функции есть аргумент в функции, которая срабатывает например по таймеру

%s/имя этой функции/указатель на эту функцию/

kalobyte писал(а):как мне передать ааа и 12 в ту функцию, если в коде оно записывается типа settimer(1,foo); и срабатывает он типа каждую секунду

Смысл Callback-функции в том, чтобы получать в неё нотификации. Если нужна в параметрах callback-а некая информация, определяемая тобой, то определи её в месте доступном для того кода, что дёргает за callback, чтобы он мог эти параметры вставить. Непонятно, правда, зачем так делать.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

Siarzhuk писал(а): Непонятно, правда, зачем так делать.

я просто не знаком с программированием под виндовс настолько круто
как по мне, то в функцию надо передавать параметры

вот сработал таймер и я например хочу зажечь светодиод
для этого у меня есть функция ledon(int)
в нее я передаю номер светодиода

---
у меня есть вопрос по C#
есть тут кто по этому делу?
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а):вот сработал таймер и я например хочу зажечь светодиод
для этого у меня есть функция ledon(int)
в нее я передаю номер светодиода

Вопрос в том, кто решает какой диод зажечь - если таймерная процедура - то она и передаст вам номер диода, если вы - то она может передать вам текущее значение своего счётчика параметром - анализируя который вы сможете решить - зажигать или тушить. На момент установки обработчика - номер диода ведь неизвестен, как неизвестно и расписание его возгораний. Установка callback-а - это фактически передача адреса функции-обработчика - т.е. той верёвочки за которую надо будет дёрнуть если случится предусмотренное событие. А параметры вызова "верёвочки" определяются контекстом исполнения таймерной процедуры - и заранее известны быть не могут.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

может я чего не понимаю?
почему при обычном вызове функции я могу передать ей параметры, а при обратном они типа неизвестны?
я создал таймер 1 и он срабатывает каждую секунду и вызывает функцию зажигания светодиода с аргументом 1
потом я создал второй таймер и он срабатывает каждые 2 секунды и зажигает второй светодиод с аргументом 2

все мне известно
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а):почему при обычном вызове функции я могу передать ей параметры, а при обратном они типа неизвестны?

Отчего-же неизвестны? Идите в то место где вызывается callback и передавайте всё что нужно.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

так я об этом и говорю
но ведь аргументом для функции таймера будет только имя функции, без скобок же
как передать параметры без скобок? :dont_know: :facepalm:
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а):но ведь аргументом для функции таймера будет только имя функции

Вы, наверное, с javascript-а пришли. :-) С - язык компилируемый, а не скрипт. Процессорная инструкция вызова функции оперирует адресом функции, а не её именем. При компиляции текст функции превращается в бинарный набор инструкций для процессора. При линковке программы в местах вызова функций прописываются их реальные адреса. С точки зрения процессора, вызов функции через указатель на неё мало чем отличается от обычного вызова - в случае указателя - компилятор должен заботится о том, чтобы процессору подсунули корректный адрес, в случае обычного вызова - линкер. Таким образом аргументом для функции установщика таймера будет адрес функции. И ничего более. Имя функции в коде - для компилятора это только синоним адреса этой функции, после компилятора имя не существует.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

Siarzhuk писал(а):Вы, наверное, с javascript-а пришли.

нет, я его вообще не понимаю
особенно когда аргументов функции может быть тело анонимной функции :shock: :o
я даже специальную тему создал, где я негодую

я за 25 лет перебрал всякого гавна, но нихера не понимаю, потому что инвалид на левое полужопие мозга
я должен представлять в голове образы, а не абстгакции
я четко представляю себе функцию как типа мясорубку
в одну дырку помещается исходник, из другой дырки выходит переработанное

я так же боле менее представляю указатель

но я уже не представляю себе указатель на функцию

функции обратного вызова я вижу как веревку, за которую дергает какая-то функция, аргументом которой есть моя функция обратного вызова

я сейчас декомпилировал оберту шарповую над чистой длл
разглядываю исходник типа и вот обнаружил эти л и в парам
и перехват сообщений виндовса
т.е. есть константа wm_user которая 1024 и пользовательские сообщения, которые в длл определены со своими смещениями

Код: Выделить всё

// PSKCoreWrap.PSKCore
protected override void WndProc(ref Message m)
{
   switch (m.Msg)
   {
   case 2024:
      if (this.DataReady != null && this.Running)
      {
         this.DataReady(this, new DataReadyArgs((int)m.WParam, (int)m.LParam));
         return;
      }
      break;
   case 2025:
      if (this.CharReady != null && this.Running)
      {
         this.CharReady(this, new CharReadyArgs((char)((int)m.WParam), (int)m.LParam));
         return;
      }

я правда не понял, что такое CharReady
CharReadyArgs это eventhandler

в шарпе оно вот так делается

Код: Выделить всё

private void frmMain_Load(object sender, EventArgs e)
      {
         // Hook up a DataReady event handler
         
             _pskCore.DataReady += _pskCore_DataReady;
             _pskCore.CharReady += _pskCore_CharReady;
                         
      }

хер знает как это работает и что значит

Код: Выделить всё

private void _pskCore_CharReady(object sender, CharReadyArgs e)
        {
         
            lblchar.Text = e.Character.ToString();
             
        }

_pskCore_CharReady это типа обработчик события CharReady
а CharReadyArgs имеет свойство Character

new CharReadyArgs((char)((int)m.WParam), (int)m.LParam));
я так понимаю, что если сообщение имеет код case 2025: , то вызывается как раз функция обратного вызова CharReadyArgs и в нее передаются 2 переменные парам

когда мыш подводиш, то там всплывает подсказка и указаны уже конкретные переменные

если нажать на функцию, то перебрасывает на код

Код: Выделить всё

// PSKCoreWrap.CharReadyArgs
public CharReadyArgs(char Character, int Channel)
{
   this.Character = Character;
   this.Channel = Channel;
}


ты имел в виду это - своя функция, которая типа зажигает светодиоды
вобщем хер знает как это все устроено :evil:
тематические ответы только в форуме, в приват не пишите
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Re: Вопросы по С/С++ (СИ)

Сообщение kalobyte »

часть 2 насчет примера с таймерами и обратными вызовами
https://msdn.microsoft.com/en-us/librar ... 85%29.aspx

Код: Выделить всё

// Set the timer for the mousetrap. 
 
uResult = SetTimer(hwnd,      // handle to main window
    IDT_MOUSETRAP,            // timer identifier
    10000,                    // 10-second interval
    (TIMERPROC) MyTimerProc); // timer callback
 

(TIMERPROC) MyTimerProc вот вызывается пользовательская функция БЕЗ ПАРАМЕТРОВ!!1

видиш там 10 секунд один таймер
вот я хочу вызывать MyTimerProc с аргументом 1, типа зажечь светодиод 1

а как я в эту функцию передам параметр?

Код: Выделить всё

// MyTimerProc is an application-defined callback function that 
// processes WM_TIMER messages.
 
VOID CALLBACK MyTimerProc(
    HWND hwnd,        // handle to window for timer messages
    UINT message,     // WM_TIMER message
    UINT idTimer,     // timer identifier
    DWORD dwTime)     // current system time
{

зачем в функции idTimer? он нигде потом в коде не используется
откуда я знаю, какие параметры надо обязательно передавать в мою функцию?

как моя эта функция будет знать, что я передаю ей номер светодиода?

зачем передавать HWND hwnd, UINT message и обязательно ли во всех случаях передавать эти все параметры?
тематические ответы только в форуме, в приват не пишите
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

kalobyte писал(а):а как я в эту функцию передам параметр?
Судя по всему - никак.
Но никто не мешает создать отдельную переменную, в которой будешь передавать номер. Или вообще создать класс, с функцией-установкой таймера, с каллбеком и переменной-номером светодиода, и всё в одном классе реализовать.

kalobyte писал(а):зачем в функции idTimer? он нигде потом в коде не используется
Это ID таймера. Функция-калбек одна, а таймеров может быть несколько.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение ARV »

kalobyte писал(а):а как я в эту функцию передам параметр?
параметры в callback-функцию передает тот, кто вызывает эту функцию! то есть операционная система. вы же не вызываете эту функцию, а определяете ее в коде и затем передаете ее адрес в виде параметра функции SetTimer, извещая тем самым операционную систему о том, что существует эта самая callback-функция. теперь система в нужный момент ее вызовет, создавая для вас проблему, ибо момент ее вызова заранее неизвестен.

в отличие от прерываний в МК здесь все значительно хуже, т.к. никто никак не ограничивает вас (теоретически) в том, что можно делать внутри этой самой функции: вы можете, например, обратиться к GDI для рисования в окне - и это нормально. но вот если таймер ваш истечет как раз в момент, когда вы (или ОС) уже рисует в окне, вы можете попортить картинку. то есть использование callback-функций требует от вас использовать в принудительном порядке методы многопоточного программирования: семафоры, синхронизацию, безопасные секции кода и т.п.

оно вам надо? опыта у вас мало - используйте сообщения таймера WM_TIMER, и не парьте мозг с callback-ами. ну будет у вас обработка таймера слегка плавать - на десятки микросекунд, это для вас критично?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а):я должен представлять в голове образы, а не абстгакции

Для прояснения образов помогает поковырять какой-нибудь мелкобитный МК - посмотреть что куда упало в итоге. На уровне организации объектов в памяти нету вообще никакой абстракции - одна конкретика.

kalobyte писал(а):я так же боле менее представляю указатель
но я уже не представляю себе указатель на функцию

Указатель на функцию - это "номер мясорубки" - место в адресном пространстве, где находится начало функции. Т.е. вас послали к мясорубке номер 0х12345656, вы вкладываете в устье кусок мяса (помещаете параметры в стек), нажимаете кнопку и ждёте пока она жужжит, забираете (из регистра eax или из стека) фарш и возвращаетесь в то место откуда пришли.

kalobyte писал(а):функции обратного вызова я вижу как веревку, за которую дергает какая-то функция, аргументом которой есть моя функция обратного вызова

Функции - это куски адресного пространства. При её вызове в стрек помещаются параметры и адрес возврата, затем управление передается на начало тела функции. По достижении управлением инструкции ret из стека возьмётся адрес по которому нужно вернуть управление. Т.е. физически вы оперируете адресом этого куска кода. При установке callback-а передается только этот адрес а не сама функция. Вы не можете принести "мясорубку" в более удобное для вас место или передать её кому-то чтобы он накрутил фарша. Вы можете его только послать к ней - сказав ему её номер.

kalobyte писал(а):я сейчас декомпилировал оберту шарповую над чистой длл

За шарп ничего не скажу - это счастье меня миновало. Но он, ИМХО, ещё более абстрактен чем MFC.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Вопросы по С/С++ (СИ)

Сообщение Siarzhuk »

kalobyte писал(а): (TIMERPROC) MyTimerProc вот вызывается пользовательская функция БЕЗ ПАРАМЕТРОВ!!
[...]
а как я в эту функцию передам параметр?


увы, никак, определение функции не предусматривает такой возможности. От системы вам нужен сервис "точного" времени - и вы его получаете - дополнительные плюшки придётся навешивать уже на вашей стороне - в обработчике событий таймера.

kalobyte писал(а):

Код: Выделить всё

VOID CALLBACK MyTimerProc( 
    HWND hwnd,        // handle to window for timer messages
    UINT message,     // WM_TIMER message
    UINT idTimer,     // timer identifier
    DWORD dwTime)     // current system time
{

зачем в функции idTimer? он нигде потом в коде не используется

номер таймера однозначно его идентифицирующий, как уже вам сказали - одно окно может иметь много таймеров и чтобы различать какой сработал и нужен этот идентификатор. Кроме того идентификатор будет нужен для того, чтобы остановить таймер.

kalobyte писал(а):откуда я знаю, какие параметры надо обязательно передавать в мою функцию?

Если речь о вышеописанном callback-е то вам не нужно ничего вызывать - это вас вызовут. А вообще, при вызове функции вы обязаны передать все параметры описанные в её прототипе - иначе она просто не скомпилируется.

kalobyte писал(а):как моя эта функция будет знать, что я передаю ей номер светодиода?

Никак - система такой возможности не предусматривает - её дело дать вам сервис таймера. Остальное шерифа не волнует.

kalobyte писал(а):зачем передавать HWND hwnd, UINT message и обязательно ли во всех случаях передавать эти все параметры?

Таймер может заряжаться как для посылки сообщений в окно, так и для посылки оных в callback функцию. Судя по всему даже в последнем случае без окна это не обходится - пусть даже косвенно. Видимо плата за универсальность. Нагугливание на около-WM_TIMER-ные темы даёт весьма забавные картинки - не забывайте, сервис без значимых модификаций приполз ещё от 16-битных динозавров-оболочек над DOS. Хочу сказать, что это далеко не единственное место где из системного API торчат белые нитки - например очень часто приходится в потоке крутить цикл GetMessaeg/PeekMessage чтобы оно работало. И всё это в XXI веке. Все уже давно махнули рукой - как есть, так есть.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Ответить

Вернуться в «Разные вопросы по МК»