2012-12-20 6 views
7

アプリケーションで共通コントロールを有効にしようとしています。 this MSDN articleに記載されている手順、具体的にはUsing ComCtl32.dll Version 6 in an Application That Uses Only Standard Extensionsの手順に従いました。しかし、私はそれを働かせることはできません。Windowsアプリケーションで共通コントロールを有効にする方法

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

「タイプ= 'Win32の' 名前= 'Microsoft.Windows.Common-コントロール' バージョン= '6.0.0.0' processorArchitecture = '*' なPublicKeyToken = '6595b64144ccf1df' LANGUAGE = '*' xmlns = 'http://schemas.microsoft.com/developer/msbuild/2003' ";%(AdditionalManifestDependencies)

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

また、ComCtl32.libにリンク依存関係を追加するプロジェクトのプロパティ|構成プロパティ|リンカー|入力|追加の依存関係。 (それが失敗したことを意味する)

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

しかしInitCommonControlsExへの呼び出しは常にFALSEを返します。また、私はこのように初期化さINITCOMMONCONTROLSEX構造で、起動時にInitCommonControlsExを呼び出します。いくつかの調査の後、GetLastErrorから返されたエラーコードがERROR_FILE_NOT_FOUNDであることがわかりました。何が問題なの?

更新: "ファイルが見つかりませんでした"というエラーが発生しました。私は、デバッガからアプリケーションを実行すると、出力ウィンドウ内の行の一つは次のとおりです。

'MYAPP.EXE':ロード「C:\ WINDOWS \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002。 18305_none_88f3a38569c2c436 \ COMCTL32.DLLは」てKernel32.lib、user32.libのようなより多くの標準ライブラリの一部についても同様の線の束がなどがある、

しかしPDBファイルを検索したり、開くことができません:

'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のために異なっているかもしれませんか?

+0

私は明らかな質問をします。マニフェスト情報を手動で追加しないで*動作しますか? – WhozCraig

+0

@WhozCraigそれを試してみましたが、うまくいきませんでした。 – user1610015

+0

WinMainの最初の行としてInitCommonControls()(Ex versonではなく)を呼び出すことを検討しましたか?それはうまくいかないでしょうか?または、新しいビジュアルスタイルの1つを取得しようとしていますか? – selbie

答えて

10

OK。私はこれについていくつかの宿題をして、何か新しい自分を発見した。どのように私は最終的に仕事にこれを持って、あなたがやろうとしているほとんど何た:

  1. ゴープロジェクト/プロパティ/リンカ/マニフェストファイル/追加のマニフェストの依存関係に
  2. 次のテキストを入力します。逐語(すべての一重引用符と二重引用符は以下のとおりです)。これはすべて1行にまとめられています。

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

  3. 設定を保存AN FULLプロジェクト(そうでない場合は液)を行い、マニフェストとPCH再生を強制的に再構築します。

    ロード 「C:\ WINDOWS \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 5.82.7601.17514 _none_ec83dffa859149af \

先立ち、この次のことを行うには、私の負荷のリストにありましたCOMCTL32.DLL」

手forcnigのコモンコントロールのマニフェストバージョンをした後、ロード・リストは今これを含み(かつ適切にTRUE回答します最初の場所でこのすべてのポイントである10):

は 'C:\ WINDOWS \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_ 6.0.7601.17514 _none_41e6975e2bd6f2b2の\のCOMCTL32.DLL' をロード

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

希望します。

+0

ありがとうございます、今すぐ使えます!したがって、エラーの原因となったのは「xmlns」属性のみでした。私はMSDNの記事に書かれていたものをコピーして貼り付けたので、その属性が最初にどのようにそこにあるのかさえ分かりません。私は引用符を取得しようとしている間、VSによって追加されている必要があります。 – user1610015

8

いいえ、PDBファイルに関する警告は、WindowsシステムDLLのデバッグ情報がないことを伝えるだけのものです。もちろん、InitializeCommonControlsEx()からの偽の戻り値を得ることは重要な問題です。

使用するAdditional Manifest Dependencies文字列に問題があります。私はしばらくそれを試しましたが、欠陥を見つけることはできませんでした。ソースコードにリンカオプションを指定するほうが簡単です。

#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='*'\"") 

ソースコードのいずれかに上記のコードスニペットをコピーして貼り付けてください。

関連する問題