2009-08-22 11 views
1

私はそれだけで1行で説明するのは難しい主な理由は、タイトルはほとんど意味がありません知っています。そこでここでは状況があります:DWM /エアロが有効になっているかどうかの確認、および同じバイナリに生きているコードを有する2000/XP/Vistaの/ 7

私はバイナリは、Windows 2000以降を対象としていたプログラムを持っています。今、私は先に進み、ユーザーがVista/7で動作しているかどうかを確認するためのコードを追加し、そうであればAero/DWMが有効かどうかを確認します。これに基づいて、特定のプラットフォームに関係のないものを無効にし、他の機能を有効にします。私の主な問題は、Visual C++ 2008からDwmIsCompositionEnabledを呼び出すには、dwmapi.libファイルを追加してそれに対してコンパイルする必要があります。 Vistaまたは7以外でバイナリを実行すると、「コンポーネントを見つけることができません.dwmapi.dllが見つからないため、アプリケーションを開始できませんでした」というエラーが表示されます。もちろん、これはDWMが新しく旧式のプラットフォームでは使用できないために発生すると予想されます。

私の質問は次のようになります。私は何とかこれをやってのけるために管理することが可能になりますか?すべてのOSバージョンに1つのバイナリがあり、そのDWMチェックコードが含まれていますか?このプログラムは、Visual Studio 2008、Visual C++、MFCを使用して書かれています。

+1

私はそれを自分でやったことがないが、Windowsが特定の条件指定されたメイン1内部に埋め込まれ、他のバイナリに延期してもらうことが可能である(最も一般的な用途は、統一された32ビット/ 64ビットのバイナリで、プロセスエクスプローラを実行するためにこれを使用しています64ビットモードでは32ビットバイナリから)。 – ewanm89

+0

マイクロソフトはこの技術をサイドバイサイドアセンブリと呼んでいるようで、MSDN http://msdn.microsoft.com/en-us/library/ms235531.aspxに文書化されていますが、ほとんどのドキュメントは、それを使用して、複数のライブラリバージョンをカプセル化するDLLを作成することを参照してください。 – ewanm89

+0

コメントありがとうございます。あなたは正しい答えに私を導いた。 – enriquein

答えて

2

私はリンカーにdwmapi.dllを遅延させるよう指示することができます。

私は彼が一種の実際の答えを見つけることへのパスを共振させて私を導いたと述べた何かのでewanm89感謝したいと思います。

+1

ええと、私が眠ったとき、私はあなたが条件にdllをロードし、2番目のバイナリを必要としないかどうか疑問に思った。 – ewanm89

+1

眠っているうちに!印象的な。 –

1

通常の解決策は、LoadLibraryの()とのGetProcAddress()を使用することです。どちらも、プログラムの開始後に行うことができます。しかし、DelayLoadソリューションの場合は+1が残っています。

関連する問題