Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Conditional Variables в Windows XP

#cpp #windows


При запуске программы в Windows XP вылезает окошко с сообщением:


  Точка входа в процедуру InitializeConditionVariable не найдена в библиотеке Kernel32.dll.


Чем лечить?

Доступ к коду программы есть, могу написать функцию, реализующую тот же функционал,
используя SetEvent(). Как сделать, чтобы в зависимости от ОС вызывалась та или иная
функция? На мой взгляд, это самое простое решение.
    


Ответы

Ответ 1



Сделать обертку для condition variable (если ее еще нет), а функцию InitializeConditionVariable вызывать через GetProcAddress, а если ее нет, использовать аналоги Правда, как утверждают разработчики Chromium, сделать правильную реализацию CV под WinXP тяжело, и оно будет работать не быстро. Можете посмотреть на github Они используют GetProcAdress для получения функций и идиому pimpl для выбора той или иной реализации (для Vista или XP)

Ответ 2



Condition Variable это новшество, которого нет в XP. Они появились с Vista. Таким образом лечить это можно только хирургически - заменить condition variable на что-то другое, или использовать условную компиляцию - для XP одно, для Vista+ другое. А ещё лучше использовать std::condition_variable полностью отказавшись от платформо-зависимого решения.

Ответ 3



GetVersion() и в зависимости от возвращаемого значения вызывается тот или иной код. Только вам придется отказаться от импорта InitializeConditionVariable, а вместо этого искать (загружать) DLL, получать из нее адрес нужной функции и вызывать ее. Правда, MS не рекомендует GetVersion() теперь...

Комментариев нет:

Отправить комментарий