質問: お世話になります。 業務で必要になり、C++やMFCの経験がない中、ActiveXのサンプルを作成しております。 ブラウザはIE11(32bit)、OSはWin10Pro(64bit)です。開発環境はVisualStudio2015 Communityで、以下の参考ページのチュートリアルをそのままやってみました。 期待される形として、ブラウザに表示されたボタンをクリックすると、MFC側でコーディングしたメソッドの返値がJavaScript側に返され、JavaScriptのaleatで「Hallo World」を表示したいのですが、実際はボタンをクリックすると「Internet Explorerは動作を停止しました」と表示され、ブラウザもろとも落ちてしまいます。 【参考ページ】 【やったこと】 ・開発環境をVisualStudio2015 Communityに変えたのが違いで、あとは上記参考ページをそのままトレースした。 ・IE11の動作を32bitであることを確認、各種セキュリティ設定も確認(ActiveXはほぼ無条件で実行するレベルまで下げた)。 同様なサンプルが掲載されている他のページのチュートリアルもやってみましたが、同様にブラウザもろとも落ちる結果になっております。 他にどこか、確認する箇所はありますでしょうか? ご教示、よろしくお願いいたします。 【追記】 ご指摘を受けて、動作が停止した後に「キャンセル」や「プログラムを終了」ではなく「デバッグ」を選びました。Visual Studio Just-In-Debugger が起動し、Yesを選ぶと、 「ハンドルされない例外が 0x77E69A8A (ntdll.dll) で発生しました(iexplore.exe 内): 0xC0000374: ヒープは壊れています。 (パラメーター: 0x77EA58E8)。」 というメッセージが表示されます。 さらに、これまで気づかなかったのですが、その後でメッセージ下の「継続」を選ぶと、そのままIEは落ちずにaleatでの「Hello World」が表示され、その後ならばhtml側のボタンをクリックしても、期待通りの動作が得られることがわかりました。 【追記2】 上記参考ページに記述内容がそもそも正確ではないというご指摘を受け、他のページを参考にしてみました。 https://msmania.wordpress.com/2014/10/06/mfc-custom-activex-control-on-ie11/ 情報も比較的新しく、実現しようとしている環境に近かったため期待したのですが、メソッド追加ウィザードで必要項目を入力し「完了」をクリックすると、VisualStudioのステータスバーに「ソリューションのファイルを解析しています......(ファイル名)」と表示されたまま、VisualStudioが固まってしまいます。
回答: その参考ページの以下のコードは間違ってると思います。 ``` BSTR CAxGetOsVerCtrl::GetHelloWorld(void) { return _T("Hello World."); } ``` BSTR型を返さなければいけないのにLPCTSTR型を返しています。 正しくは以下のようになると思います。 ``` BSTR CAxGetOsVerCtrl::GetHelloWorld(void) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult(_T("Hello World.")); return strResult.AllocSysString(); } ``` また、上記のようにActiveXメソッドの先頭ではAFX_MANAGE_STATEマクロも使ってください。 その参考ページでは、ActiveXメソッドの追加を手動でコーデイングしてますが、やめた方が無難です。 ActiveXのメソッド、プロパティ、イベントは全てウィザードを使用して行った方が方がいいと思います。そうすれば、ディスパッチマップやidlファイルを手動で編集する必要はなくなります。