InitCommonControlsExの呼び出しに失敗しました.manifestがおかしいです.

7190 ワード

最近VCプログラミングでInitCommonControlsExの呼び出しに失敗しました.その原因を究明すると、manifestがおかしい.
 
ソリューションは3つあります.
1) Create manifest, call it YourApplicationName.manifest and add it to your application folder.
2) Create manifest and add it to your application resources.
3)stdafx.hヘッダファイルに次の文を追加します.
#pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

 
私が選んだのは案3です.
 
InitCommonControlsExの説明は以下の通りです.http://msdn.microsoft.com/en-us/library/windows/desktop/bb775697(v=vs.85).aspx 
原文から以下を抜粋する.
転載先
yu_xiyan
最終編集
luckily513
MFCエンジニアリングでは、InitInstance()関数(一般的にエンジニアリング名.cppファイル)に、Windows XPで実行するアプリケーションリストの指定先//ComCtl 32を使用するコードがあります.dllバージョン6以降で可視化を有効にするには、//InitCommonControl Ex()が必要です.そうでないと、ウィンドウを作成できません.  INITCOMMONCONTROLSEX InitCtrls;  InitCtrls.dwSize = sizeof (InitCtrls);//アプリケーションで使用するすべての//共通コントロールクラスを含むように設定します.  InitCtrls.dwICC = ICC_WIN95_CLASSES ;   InitCommonControlsEx (&InitCtrls); ************************************************************************************** これらのコードの役割は、注釈ではっきり言っていますが、まずこのコードがどういう意味なのか見てみましょう.私たちはInitCommonControlsEx関数から着手して、その関数の原型は:BOOL InitCommonControlsEx(LPINITCOMMONCONTOLSEX lpInitCtrls);パラメータlpInitCtrlsは、構造体INITCOMMONCONTROLSEXを指す長いポインタであり、上のコードは、INITCOMMONCONTROLSEX構造体オブジェクトInitCtrlsを作成し、そのアドレスをInitCommonControl関数のパラメータとする.INITCOMMONCONTROLSEX構造体の定義はcommctrl.hファイルでは、次のコードはcommctrlから選択する.InitCommonControlsおよびInitCommonControlsEx関数の宣言、およびtagINITCOMMONCONTROLSEX構造体の定義を含むhファイル.INITCOMMONCONTROLSEX構造体には、2つのパラメータdwSizeとdwICCが含まれています.パラメータの説明はコメントを参照してください.WIN32_IEと_WIN32_WINNTの定義はstdafxを参照してください.hファイル.InitCommonControlsEx関数の呼び出し効果は累積されます.たとえば、ICC_TAB_CLASESフラグは、InitCommonControl Exを呼び出し、ICC_BAR_CLASSESフラグが呼び出されると、tabとbar汎用コントロールクラスが登録され、プログラムで使用できます.InitInstance()関数で使用されるICC_WIN95_CLASSESは実は上のマークの組み合わせです.commctrl.h**********************************************************
WINCOMMCTRLAPI
void
WINAPI InitCommonControls(
void
);
#if
(_WIN32_IE >= 0x0300)
typedef
struct
tagINITCOMMONCONTROLSEX {     DWORD dwSize;         
//
size of this structure構造体の大きさ
    DWORD dwICC;         
//
フラグビットは、汎用コントロールクラスがDLLからロードされることを決定するために使用され、値は次のICC_であってもよい.の組み合わせ
} INITCOMMONCONTROLSEX,
*
LPINITCOMMONCONTROLSEX;
#define
ICC_LISTVIEW_CLASSES   0x00000001
//
listview, header
#define
ICC_TREEVIEW_CLASSES   0x00000002
//
treeview, tooltips
#define
ICC_BAR_CLASSES        0x00000004
//
toolbar, statusbar, trackbar, tooltips
#define
ICC_TAB_CLASSES        0x00000008
//
tab, tooltips
#define
ICC_UPDOWN_CLASS       0x00000010
//
updown
#define
ICC_PROGRESS_CLASS     0x00000020
//
progress
#define
ICC_HOTKEY_CLASS       0x00000040
//
hotkey
#define
ICC_ANIMATE_CLASS      0x00000080
//
animate
#define
ICC_WIN95_CLASSES      0x000000FF
#define
ICC_DATE_CLASSES       0x00000100
//
month picker, date picker, time picker, updown
#define
ICC_USEREX_CLASSES     0x00000200
//
comboex
#define
ICC_COOL_CLASSES       0x00000400
//
rebar (coolbar) control
#if
(_WIN32_IE >= 0x0400)
#define
ICC_INTERNET_CLASSES   0x00000800
#define
ICC_PAGESCROLLER_CLASS 0x00001000  
//
page scroller
#define
ICC_NATIVEFNTCTL_CLASS 0x00002000  
//
native font control
#endif
#if
(_WIN32_WINNT >= 0x501)
#define
ICC_STANDARD_CLASSES   0x00004000
#define
ICC_LINK_CLASS         0x00008000
#endif
 WINCOMMCTRLAPI BOOL WINAPI InitCommonControlsEx(LPINITCOMMONCONTROLSEX);
#endif
     
//
_WIN32_IE >= 0x0300
************************************************************************************************************************
ICC_BAR_CLASSES:ツールバー、ステータスバー、Trackbar、tooltipクラスを登録します.ICC_COOL_CLASSES-Rebarクラスを登録します.ICC_DATE_CLASSES-Date and Time Pickerクラスを登録します.ICC_HOTKEY_CLASS:ホットキークラスを登録します.ICC_INTERNET_CLASES-IP Address Pickerクラスを登録します.ICC_LISTVIEW_CLASSES:ListViewとHeaderクラスを登録します.ICC_PAGESCROLLER_CLASS:Pagerクラスを登録します.ICC_PROGRESS_CLASS:Progress Barクラスを登録します.ICC_TAB_CLASES-TabクラスとTooltipクラスを登録します.ICC_TREEVIEW_CLASES-TreeViewとTooltipクラスを登録します.ICC_UPDOWN_CLASS:Up-Downクラスを登録します.ICC_USEREX_CLASES-ComboBox Exクラスを登録します.ICC_WIN95_CLASES-InitCommonControl関数に登録されているすべてのクラスを登録します.
 
manifestについては、次の項を参照してください.http://blog.csdn.net/hzgdiyer/archive/2010/04/12/5479046.aspx
原文の抜粋は以下の通りである.
manifestの原理と用途
dllは動的に呼び出されるため、いくつかのプログラムで共有されて使用されますが、dllがアプリケーションが知らないままアップグレードされたり、別のプログラムで変更されたりすると、「DLL Hell」という問題が発生する可能性があります.
システムの資源がますます豊かになるにつれて、ハードディスクはそんなに緊張しないので、XP以降のオペレーティングシステムの中で、新しいメカニズムでDLLを管理します
(このメカニズムは.NETだけでなく通常のNativeプログラムについても同様である)
manifestはXMLの記述ファイルで、DLLごとにDLLのManifestファイルがあり、アプリケーションアプリケーションアプリケーションごとに独自のManifestもあります.
アプリケーションにとって、Manifestはexeファイルと同じディレクトリの下であることができる.manifestファイルは、exeファイルの内部にリソースとして埋め込まれていてもよい(Embed Manifest)
XP以前のバージョンのwindowsは、以前のようにこのexeファイルを実行し、対応するdllを探します.違いはありません.Manifestは余分なファイルやリソースにすぎません.dllファイルはシステム32のディレクトリの下で直接検索され、呼び出されます.
XP以降のオペレーティングシステムでは、まずManifestを読み取り、exeファイルが呼び出す必要があるDLLリストを取得します(このとき取得されるのは、DLLファイル自体の位置ではなく、DLLのmanifestです).オペレーティングシステムは、DLLのManifestに基づいて対応するDLL<を探します.そのため、異なるバージョンの同じDLLファイルを区別したり、プログラム自体を指定したりするDLL>
ただし、Visual Studio 2005以降の新しい問題は、VS 2005に搭載されている8.0新しいCライブラリ(VC 8.0 CRT)ファイルがXP以降でmanifestをサポートするWindowsバージョンで呼び出されると、アプリケーション自体のManifestをチェックし、そうでないと呼び出されません.つまり、Visual Studioが開発したApplicationを使って、マニフェストは欠かせません(MSがなぜこのように設定したのか分からないので、VS 2003.NETとは違います.後で考えてみると、MS自身が言っているどのような堂々とした理由を除いて、少なくともLinuxのWineシミュレーションは面倒になります)
ただし、あなたのプログラムは静的リンクであり、dllは使用されず、オペレーティングシステムのコアのKernel 32のみが使用されています.dll, User32.dll, Ole32.dll、またはShDocVW.dllなど.プロジェクトの設定は、UseStandard Windows Libraries、Not Using ATL、No Common Language Runtime supportであること
マニフェストを消してもいいです
VS 2005におけるMenifestに関する設定
  • Project/Properties/Link/Manifest File/Generate Manifestは、Manifestを生成するかどうかを決定し、
  • を閉じることができます.
  • Project/Properties/Link/Manifest File/Allow IsolationこれはDLLを設定する呼び出しであり、Manifestが必要かどうかを決定することはできません.
  • Project/Properties/Manifest Tool/Input and Output/Embed Manifestは、Manifestが個別のファイルであるかexeに埋め込まれたリソースであるかを決定する
  • 私にとって、SDLを使うのはDLLを有効にする動的リンク方式でなければならないので、Manifestをオンにし、Manifest Embedをexeに入れるのが便利です.
    上記の内容に対応するソフトウェアの配布方法に関する問題は、実際にはVC 6のみである.0のCRTライブラリはWindowsの一部としてバインドされており、その後VS.netからVCプログラムがインストールパッケージを作成するにもライブラリファイルを考慮する必要があるが、VC 6にすぎない.0の場合はSystem 32,VCをコピーすることを推奨する.Netではexeファイルlocalディレクトリに置くことをお勧めしますが、今VS 2005ではManifestの問題も考慮する必要があります.面倒そうに見えますが、実はまあまあです.VSはツールを持ってパッケージ化されています.次のサイトでは、手でredistributionを作る方法も説明されています.
     
     
     
    o了.
    以上、皆さんの参考と指導.
    記事の出典:http://blog.csdn.net/thirdprince/article/details/6336010、いくつかの誤字とコードエラーを修正しました.