Создание скринсейвера для XP с использованием VC ++ 2008 - PullRequest
6 голосов
/ 06 мая 2009

Я пытаюсь скомпилировать скринсейвер с использованием Visual C ++ 2008 Express Edition SP1 в Windows XP. Я получаю сообщение об ошибке во время выполнения: «Не удалось найти точку входа в процедуру ChangeWindowMessageFilter() в библиотеке динамических ссылок USER32.dll». Насколько я могу судить, это связано с тем, что Microsoft испортила библиотеку scrnsave.lib, входящую в состав VS 2008, для вызова специфичной для Vista функции, которая не работает в XP, поскольку функция не существует.

Определение WINVER, похоже, ничего не делает.

Как я могу обойти это?

Ответы [ 3 ]

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

Глядя на это в MSDN для « ChangeWindowMessageFilter » указывает, что он специфичен для Vista и является частью User32.lib, с которой вы ссылаетесь, поскольку Windows XP не имеет этой функции в User32.dll .... отсюда и взрыв ... рекомендуется следовать предложению Майкла, чтобы загрузить более старую версию SDK ... другого способа сделать нет ... Интересно, можете ли вы установить другую сторону SDK? одна для платформ Vista, а другая для платформ Win XP?

Редактировать: Я нашел интересную ссылку здесь об этом здесь, в блоге ... Он говорит о точно такой же проблеме, возьмите старую копию scrnsave.lib из более старая установка (VS 2005, если у вас есть доступ к одному или спросить друга / коллегу?) Говоря о вышеупомянутой функции, которая специфична для Vista - вот интересное мнение , почему ее не следует трогать ...

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

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

Написать функцию-заглушку (многие детали исключены из кода)

BOOL WINAPI ChangeWindowMessageFilter(      
   UINT message,
   DWORD dwFlag)
{
   if (running_on_vista_or_later)
   {
      ....
      pfn = GetProcAddress(... "ChangeWindowMessageFilter");
      return pfn (message, dwFlag);
   }

   return TRUE;
}

Если объект obj или lib, в котором находится эта функция, находится перед строкой user32.lib в строке ссылки, компоновщик должен выбрать функцию-заглушку, а не функцию из user32.lib.

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

0 голосов
/ 06 мая 2009

Вы можете попробовать получить более старую версию Platform SDK и сослаться на ее версию scrnsave.lib.

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en - это ссылка для загрузки пакета SDK для платформы Windows Server 2003 с пакетом обновления 1 (SP1).

...