VS2012でのAfxInitRichEdit2()失敗

違う環境でどうなるのかは把握していないが、こんな現象が。

Visual Studio 2012をWindows7にインストール、MFCアプリケーションを単純にダイアログで作成してみる。
そのダイアログにツールボックスからRichEdit2.0を載せてみる。
で、コンパイル。は、何事もなく終了。で、実行すると、
ダイアログ作成に失敗して即座に終了してしまう。

調べて行くと、InitInstanceで呼ばれているRichEditの初期化関数、AfxInitRichEdit2()がfalseを返していることがわかる。
RichEditを使う際にはRICHED20.DLLをロードしなければならず、その処理をAfxInitRichEdit2()がやってくれるはずなのだが。
で、デバッガでMFCのソースの中まで追っかけてみると、Windows8とそれ以前の場合でLoadLibraryの処理が異なり、この環境ではOSがWindows7なのにも関わらずWindows8の処理へ流れている。
_WIN32_WINNTの定義がまずかったのかと思い、とりあえず
#define _WIN32_WINNT 0x501
とかしてみても結果は同じ。うーん、MFCをコンパイルしなおさなければならないのか??

とまぁ思案したんだが、面倒くさくなってしまって。
それじゃぁAfxInitRichEdit2内部でやるはずだったLoadLibraryを直接やっちまえ、ってことで、
InitInstanceにこう書いた。
if (!AfxInitRichEdit2()) {
const WCHAR *pszLibrary = L"RICHED20.DLL";
WCHAR wszLoadPath[MAX_PATH + 1];
if (::GetSystemDirectory(wszLoadPath, _countof(wszLoadPath)) != 0) {
if (wszLoadPath[wcslen(wszLoadPath) - 1] != L"\\") {
wcscat_s(wszLoadPath, _countof(wszLoadPath), L"\\");
}
wcscat_s(wszLoadPath, _countof(wszLoadPath), pszLibrary);
::LoadLibrary(wszLoadPath);
}
}


これでRichEdit2.0の載ったダイアログもきちんと表示されるようになりましたとさ。
エラー処理が無くってちょっとアレかなとも思うけれども、もともと戻り値を見ないでAfxInitRichEdit2()としていただけなんだから、大して困るわけでもないしな、と、気にしないことにして。

たぶん同じ理由で、VS2010から移行したRichEdit(2.0でないやつ)の場合も、AfxInitRichEdit()で失敗する。
その場合も、読み込むライブラリを"RICHED32.DLL"にすればいけるような気がする。
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

f_yamaki

Author:f_yamaki

アクセスカウンタ
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム

この人とブロともになる

ブログ内検索
RSSフィード
リンク