6

WindowsXPでVisualC++ 2008 ExpressEditionSP1を使用してスクリーンセーバーをコンパイルしようとしています。ランタイムエラーが発生します:「プロシージャエントリポイントChangeWindowMessageFilter()がダイナミックリンクライブラリUSER32.dllに見つかりませんでした。」私の知る限り、これは、MicrosoftがVS 2008に含まれているscrnsave.libライブラリを失敗させて、Vista固有の関数を呼び出すためです。この関数は、XPでは関数が存在しないため失敗します。

定義WINVERしても何も起こらないようです。

どうすればこれを回避できますか?

4

3 に答える 3

1

これをMSDNの「ChangeWindowMessageFilter 」で見ると、Vista固有であり、リンク先のUser32.libの一部であることがわかります。これは、WindowsXPのUser32.dllにその機能がないためです。ブローアップ...古いバージョンのSDKをダウンロードするというMichaelの提案に従うことをお勧めします...他に方法はありません...別のSDKを並べてインストールできますか?Vistaプラットフォーム用とWin XPプラットフォーム用の他?

編集:私はブログでこれについてここに興味深いリンクを見つけました...それはまったく同じ問題について話します、古いインストールからscrnsave.libの古いコピーを取得します(あなたが1つにアクセスできるか友人に尋ねるならVS2005 / colleague?)ビスタ固有の上記の機能について言えば、これは、なぜ触れてはいけないのかについての興味深い意見です...

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-20T02:12:52.237 に答える
0

古いバージョンのPlatformSDKを入手して、そのバージョンのscrnsave.libにリンクしてみてください。

http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=enは、Windows Server2003SP1プラットフォームSDKのダウンロードリンクです。

于 2009-05-06T00:54:04.917 に答える
0

スタブ関数を書く (多くの詳細がコードから省略されています)

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 を返します。

于 2010-02-21T07:57:19.383 に答える