Russian Qt Forum
Ноябрь 22, 2024, 13:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: вызов WinAPI функций, которые есть не во всех системах  (Прочитано 9789 раз)
kambala
Джедай : наставник для всех
*******
Online Online

Сообщений: 4747



Просмотр профиля WWW
« : Март 25, 2012, 22:42 »

Здравствуйте. Как правильно вызывать функции, которые есть не во всех системах? Сейчас я использую GetProcAddress(), но глаз просто не нарадуется такому коду Улыбающийся

Вот например, мне нужно задать для приложения Application User Model ID. Для этого служит функция SetCurrentProcessExplicitAppUserModelID(), которая есть только в виндоус 7 и выше:
Код
C++ (Qt)
typedef HRESULT (__stdcall *PSCPEAUMID)(PCWSTR);
 
PSCPEAUMID pSCPEAUMID = (PSCPEAUMID)GetProcAddress(GetModuleHandle(L"shell32.dll"), "SetCurrentProcessExplicitAppUserModelID");
if (pSCPEAUMID)
{
   HRESULT hr;
   if (SUCCEEDED((hr = pSCPEAUMID(L"myId"))))
       qDebug("SetCurrentProcessExplicitAppUserModelID success");
   else
       qDebug("SetCurrentProcessExplicitAppUserModelID error: %d", HRESULT_CODE(hr));
}

Может существуют иные подходы, которые позволяют вызывать функции напрямую?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Март 25, 2012, 23:06 »

GetProcAddress (dlsym на OSX) кажется милым и родным после столкновения со страхомудием MSVC манифеста. Как бы GetProcAddress вообще не отобрали (я об этом переживаю)
Записан
Zeka13
Гость
« Ответ #2 : Октябрь 07, 2012, 13:44 »

используйте функцию определения версии ОС в if(), разве не очевидно?
Записан
Bepec
Гость
« Ответ #3 : Октябрь 07, 2012, 14:24 »

++ к Зеке.

GetWindowsMajorVersion + GerWindowsMinorVersion;

Где то я даже видел краткий справочник по версиям Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Online Online

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Октябрь 07, 2012, 15:29 »

тогда код не скомлипируется на ОС, где нету таких функций. например код вызывает функцию из винды 7 по возможности, а компиляция происходит на ХР. а вот динамический резолв из длл в таком случае прокатит.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #5 : Октябрь 07, 2012, 15:31 »

Тогда if switch твой удел. Хотя в упор не понимаю. Если программа должна работать на высшей системе и поддерживать (ПОДДЕРЖИВАТЬ) низшую версию, то компилиться она должна именно на высшей.

Ты тогда дефайны запихай. Где то видел вроде дефайн на XP, но не помню точно.
Записан
kambala
Джедай : наставник для всех
*******
Online Online

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Октябрь 07, 2012, 15:38 »

Если программа должна работать на высшей системе и поддерживать (ПОДДЕРЖИВАТЬ) низшую версию, то компилиться она должна именно на высшей.
а где такой закон написан?

если использовать дефайны, то программа, собранная на ХР, не будет иметь поддержки специфических функций для высших версий ОС. ты не понимаешь разницы между compile-time check и run-time check?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #7 : Октябрь 07, 2012, 15:50 »

Я тебе о чём и говорю. А про "высшую-нижнюю" вроде бы из какого то курса по программированию.

И представь - оно реально работает Веселый

А так у тебя пути не остаётся. Или if или отказ от XP сборки.

Ибо без функций у тебя всё не скомпилится, а с функциями тебе не подходит ибо их не будет.

PS я понимаю. Так же я понимаю что использовать ф-ции высшей системы без самой высшей системы врядли получится. Потому дллка, адрес, проверка, всё круто.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Октябрь 07, 2012, 16:31 »

Я тебе о чём и говорю. А про "высшую-нижнюю" вроде бы из какого то курса по программированию.

И представь - оно реально работает Веселый
Вижу что человек далек от Mac - там быстро отучат от кратких курсов  Улыбающийся
Записан
V1KT0P
Гость
« Ответ #9 : Октябрь 07, 2012, 16:38 »

И представь - оно реально работает Веселый
Интересно как оно работает, по идеи весь импорт должен быть получен на этапе старта и если вдруг в библиотеки не обнаруживается нужная функция то должна произойти такая ошибка:
Цитировать
Точка входа в процедуру FUNCTION_NAME не найдена в библиотеке DLL LIBRARY_NAME.
Вот только что сделал маленький пример, консольное приложение и две версии библиотеки одна с двумя функциями, другая с одной. Если первая возвращает число 2, то можно вызывать вторую, если 1 то не вызываем. Так вот с первой все работает, со второй как и предполагал "Точка входа не найдена". При чем эта ошибка появляется до выполнения функции main.
Если я чего-то не понимаю то просветите пожалуйста, очень интересно.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Октябрь 07, 2012, 20:12 »

Если программа должна работать на высшей системе и поддерживать (ПОДДЕРЖИВАТЬ) низшую версию, то компилиться она должна именно на высшей.

Бред, совместимость если и есть, то снизу вверх, а никак не наоборот.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.