Управление различиями в Windows API между Windows XP и Vista / Server 2008 - PullRequest
4 голосов
/ 12 февраля 2010

Я пытаюсь создать отдельный исполняемый файл простого приложения Win32, которое должно работать как в Windows XP, так и в Windows Vista / 2008.

Из-за некоторых изменений в работе Vista необходимо выполнить некоторые дополнительные вызовы Win32 API, чтобы программа работала правильно, как в XP.

В настоящее время я определяю, работает ли приложение в версии Windows, более новой, чем XP, и при необходимости вызываю дополнительные функции win32. Это отлично работает при работе в Vista и Server 2008, но не работает при работе в Windows XP.

В Windows XP при запуске программы появляется сообщение об ошибке: Не удалось найти точку входа в процедуру ShutdownBlockReasonCreate в библиотеке динамических ссылок USER32.DLL. Это происходит до того, как начинает выполняться любой мой код, и ни один из путей кода при работе на XP не должен вызывать эту функцию.

Мне бы очень хотелось иметь только один исполняемый файл, который работает как на XP, так и на Vista. Если возможно, я не хочу иметь условную компиляцию и иметь два исполняемых файла.

Как лучше всего решить эту проблему?

Ответы [ 5 ]

6 голосов
/ 12 февраля 2010

Вы должны будете использовать LoadLibrary () и GetProcAddress (), чтобы получить точку входа для этой функции. В XP вы получите значение NULL от GetProcAddress (), достаточно хорошее, чтобы просто пропустить вызов. В документации SDK есть хороший пример , единственная сложная часть - объявление указателя функции:

  typedef BOOL (WINAPI *MYPROC)(HWND, LPCWSTR); 
4 голосов
/ 12 февраля 2010

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

2 голосов
/ 31 августа 2011

В Windows XP при запуске программы появляется сообщение об ошибке: Не удалось найти точку входа в процедуру ShutdownBlockReasonCreate в библиотеке динамических ссылок USER32.DLL.

См. Эту таблицу сравнения для API Windows XP и Vista. Согласно отчету для user32.dll символ ShutdownBlockReasonCreate ( HWND hWnd, LPCWSTR pwszReason ) был добавлен в Vista (и отсутствует в XP). Я думаю, что эта таблица может помочь вам решить другие проблемы переносимости.

enter image description here

1 голос
/ 12 февраля 2010

Win32 SDK имеет хороший пример этого в заголовке multimon.h. Поддержка нескольких мониторов была добавлена ​​в Windows 98/2000 и не поддерживается в 95 или NT 4.

#define COMPILE_MULTIMON_STUBS
#include "multimon.h"

Когда определено COMPILE_MULTIMON_STUBS, будут созданы безопасные заглушки для функций сквозного соединения, которые будут взаимодействовать с ОС на самом низком уровне. Это предотвращает спутывание кода вызова с вызовами GetVersionEx.

0 голосов
/ 12 февраля 2010

Вы также можете использовать функцию GetVersionEx , чтобы определить, на какой версии Windows работает ваша программа. Затем условно вызывать функции в зависимости от версии ОС. XP имеет dwMajorVersion = 5 и dwMinorVersion = 1; Vista имеет dwMajorVersion = 6 и dwMinorVersion = 0.

...