四十にして惑う

フリーランスITエンジニアのサバイバル日記

Web browserコントロールをMFCアプリで使う

今開発中のアプリでWEB画面が必要になった。

.NET frameworkならデフォでWEBコントロールがあるのだが、MFCベースなアプリなので、導入に多少の手間がかかったのと軽くはまったので記録に残しとく。

 

Web browserコントロールを使うには

1) ダイアログリソースのところで右クリックして

2) メニューから「ActiveXコントロールの挿入」を選択。

3) ActiveXコントロールのリストが表示されるので、そこで「Microsoft Web Browser」を選択。

4) そしてそのコントロールを選択して右クリックメニューから「変数の追加」。

5) 適当な名前を付けてOKすると、そのコントロールのラッパクラスが自動生成されて使えるようになる。

 

ここまでは順調で、実験用のテストプログラムでは問題なく動いていた。

しかし開発中のアプリにのせるとダイアログの生成できない。

デバッガで追っていくと::CreateDialogIndirect()で失敗している模様。

しかしGetLastError()は0を返す。

 

Web browserコントロールの生成に失敗していると推測してDoDataExchangeにブレイクポイントを張るが、網にかからない。。。

なぜ?

 

ベースとなるダイアログがちょっと特殊な形態だったこともあって、その線でしばらく試行錯誤するがうまくいかん。

単純なダイアログでも同じように失敗するので、ダイアログ自体の問題ではなさそうだ。

 

手詰まり感がでてきたのでGoogle先生にご相談。

Stack overflowに答えがありました。

mfc - CDialog::Create fails for dialog with ActiveX control - Stack Overflow

 

結論から言うとActiveXを使う準備ができてないのが問題だった。

そういえばテストプログラムのプロジェクトを生成するとき、ActiveXコントロールを使うみたいなチェックを入れてたっけ。。。

開発中のアプリはそのチェックを入れずに生成したのでActiveXが使えなかったみたいだ。

InitInstanceあたりでAfxEnableControlContainer()をコールするようにしたら解決した。

 

ちなみにStack overflowの記事でちょっとしたデバッグテクがあった。

ダイアログリソースのプロパティに"No Fail Create"というのがあるのだが、これをTrueにすると、とにかくダイアログを生成してくれる。

DoDataExchangeに張ったブレイクも引っかかるようになった。

それで追っていくとm_pDlgWnd->GetOleControlSite(nIDC)がNULLを返していた。

なるほど。