お世話になっております。
最近、自作のアプリの64bit化の作業を行っているのですが、
問題にぶつかってしまいました。
使用している開発環境はVisual Studio 2005 SP1です。
OSはWinVista(64bit)です。
基本的には「my_app.exe」「my_app.dll」の2つのファイルがあります。
プラットフォームとして「x64」を選択してコンパイルしました。
キャストに関するエラーがいろいろ出てきたので、INT_PTR, DWORD_PTR
などに置き換えたり、SetWindowLong -> SetWindowLongPtrなどに
書き換えたりしました。
そうして、なんとかビルドが成功して「my_app.exe」「my_app.dll」
の2つのファイルが完成しました。
ところが、デバッグしてみると以下のようなエラーメッセージが表示
されて起動できません。
「アプリケーションを正しく初期化できませんでした。(0xc000007b)」
デバッガの出力ウィンドウには、以下のように表示されます。
-----------
'my_app.exe': 'C:\Windows\System32\msctf.dll' を読み込みました。
シンボルが読み込まれていません。
デバッガ:: ハンドルされていない続行不可の例外がプロセスの読み込み中に
スローされました
プログラム '[5992] my_app.exe: ネイティブ' はコード
-1073741701 (0xc000007b) で終了しました。
-----------
EXEの中にあるメインアプリケーションクラスのコンストラクタや
InitInstance()にプレークポイントをかけても、そこにたどり着く前に
エラーになっています。DLLのDllMain()にブレークポイントを
かけても同様です。到着前にエラーです。
また、テスト用に作成した64bitアプリ(AppWizardで作った簡単なアプリです)
が正常に起動することを確認してから、
「my_app.dll」をスタティックリンクして起動すると、やはり
同じエラーが起きて起動できないので、「my_app.dll」が原因である
ことは間違いないようです。
ただ、DllMain()にすら制御がこないので、デバッグのしようがありません。
どのようなことが考えられるでしょうか?
長々と申し訳ありません。
申し訳ありません。自己解決しました。
結論からいいますと、マニフェストファイルが原因でした。
http://www.g-ishihara.com/mfc_ge_04.htm
のページで紹介されていた、下記のコードを追加したところ正常に起動できるように
なりました。
つまり「processorArchitecture」の設定が「X86」のままだったのが原因のようです。
--------
#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,/manifestdependency:\type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\")
#elif defined _M_IA64
#pragma comment(linker,/manifestdependency:\type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\")
#elif defined _M_X64
#pragma comment(linker,/manifestdependency:\type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df'
language='*'\")
#else
#pragma comment(linker,/manifestdependency:\type='win32'
name='Microsoft.Windows.Common-Controls' version='6.0.0.0'
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\")
#endif
#endif
--------
お騒がせして申し訳ありませんでした。