8

アプリケーションで共通のコントロールを有効にしようとしています。このMSDNの記事、特に標準の拡張機能のみを使用するアプリケーションでのComCtl32.dllバージョン6の使用のセクションに記載されている手順に従いました。しかし、私はそれを機能させることができません。

この記事とは異なる方法で行っているのは、プロジェクトプロパティページ|にマニフェスト情報を追加することだけです。構成プロパティ| リンカー| マニフェストファイル| 追加のマニフェスト依存関係。これは私がテキストボックスに入力するものです:

"type ='Win32' name ='Microsoft.Windows.Common-Controls' version = '6.0.0.0' ProcessorArchitecture ='*' publicKeyToken = '6595b64144ccf1df' language ='*' xmlns=' http://schemas.microsoft。 com /developer / msbuild / 2003 '";%(AdditionalManifestDependencies)

生成されたマニフェスト(MyApp.exe.intermediate.manifest)を確認すると、正しく表示されます。

また、プロジェクトのプロパティ|でComCtl32.libへのリンク依存関係を追加します。構成プロパティ| リンカー| 入力| 追加の依存関係。また、起動時に次のように初期化されたINITCOMMONCONTROLSEX構造を使用してInitCommonControlsExを呼び出します。

INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;

ただし、InitCommonControlsExを呼び出すと、常にFALSEが返されます(これは失敗したことを意味します)。調査の結果、GetLastErrorから返されるエラーコードはERROR_FILE_NOT_FOUNDであることがわかりました。何が問題なのですか?

更新:「ファイルが見つかりません」エラーに関連している可能性があることに気づきました。デバッガーからアプリを実行すると、[出力]ウィンドウの行の1つは次のようになります。

'MyApp.exe':ロード済み'C:\ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002.18305_none_88f3a38569c2c436 \ comctl32.dll'、PDBファイルが見つからないか開くことができません

ただし、kernel32.lib、user32.libなどのより標準的なライブラリのいくつかには同様の行がたくさんあります。

'MyApp.exe':ロードされました'C:\ Windows \ System32 \ ntdll.dll'、PDBファイルが見つからないか開くことができません

'MyApp.exe':ロードされました'C:\ Windows \ System32 \ kernel32.dll'、PDBファイルが見つからないか開くことができません

'MyApp.exe':ロードされました'C:\ Windows \ System32 \ msvcrt.dll'、PDBファイルが見つからないか開くことができません

'MyApp.exe':ロード済み'C:\ Windows \ System32 \ user32.dll'、PDBファイルが見つからないか開くことができません

これらの行はどのアプリケーションでも常に表示され、問題は発生しません。ComCtl32.dllでは違うのでしょうか?

4

2 に答える 2

14

わかった。これについて宿題をして、自分で何か新しいことを発見しました。私が最終的にこれを機能させる方法は、ほとんどあなたがやろうとしていることでした:

  1. プロジェクト/プロパティ/リンカー/マニフェストファイル/追加のマニフェスト依存関係に移動します
  2. 次のテキストを逐語的に入力します(すべての一重引用符と二重引用符を正確に以下のように意味します)。ところで、これはすべて1行にあります。

    "type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"

  3. 設定を保存し、完全なプロジェクト(解決策でない場合)を再構築して、マニフェストとPCHの再生成を強制します。

これを行う前は、次のものが私のロードリストにありました。

ロードされた'C:\ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 5.82.7601.17514 _none_ec83dffa859149af \ comctl32.dll'

共通コントロールのマニフェストバージョンを手動で強制した後、ロードリストにこれが含まれるようになりました(そしてInitCommonControlsEx()、最初からこのすべてのポイントである、に正しく答えます)。

ロードされた'C:\ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 6.0.7601.17514 _none_41e6975e2bd6f2b2 \ comctl32.dll'

注:これは、ソース内の#pragmaを使用して、理想的にはstdafx.hヘッダーで行うこともできますが、私はこの方法を好みます。

それが役に立てば幸い。

于 2012-12-20T19:46:06.733 に答える
9

いいえ、PDBファイルに関する警告は、WindowsシステムDLLのデバッグ情報がないことを示すためのものです。もちろん、InitializeCommonControlsEx()からFALSEを返すことが重要な問題です。

使用する追加のマニフェスト依存関係文字列に問題があります。私はしばらくそれをいじくり回しましたが、欠陥を見つけることができませんでした。多くの場合、ソースコードでリンカーオプションを指定する方が簡単です。私が使用したとき、すべてがうまくいきました:

#include <CommCtrl.h>
#pragma comment(lib,"comctl32.lib")
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

上記のコードスニペットをコピーして、ソースファイルの1つに貼り付けるだけです。

于 2012-12-20T19:43:10.783 に答える