質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

5485閲覧

MFCで作成したActiveXコントロールのメソッドに対し、JavaScriptからアクセスできない。

U-QREIL8

総合スコア16

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/26 06:50

編集2017/05/26 09:56

お世話になります。

業務で必要になり、C++やMFCの経験がない中、ActiveXのサンプルを作成しております。

ブラウザはIE11(32bit)、OSはWin10Pro(64bit)です。開発環境はVisualStudio2015 Communityで、以下の参考ページのチュートリアルをそのままやってみました。

期待される形として、ブラウザに表示されたボタンをクリックすると、MFC側でコーディングしたメソッドの返値がJavaScript側に返され、JavaScriptのaleatで「Hallo World」を表示したいのですが、実際はボタンをクリックすると「Internet Explorerは動作を停止しました」と表示され、ブラウザもろとも落ちてしまいます。

【参考ページ】
http://mkdev-note.blogspot.jp/2012/11/visual-studio2012mfc-activex-1.html
http://mkdev-note.blogspot.jp/2012/11/visual-studio2012mfc-activex-2.html

【やったこと】
・開発環境を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が固まってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/05/26 07:23

VisualStudioの実行ログで何かエラーメッセージが出ていたりしませんか?出ていたら質問に追記してください。エラーメッセージにはなぜ失敗したかなど理由や場所が書いてあることがあるので、エラーメッセージを読み解くことで解決の糸口となります。
U-QREIL8

2017/05/26 08:22

ありがとうございます。追記いたしました。
guest

回答3

0

ベストアンサー

その参考ページの以下のコードは間違ってると思います。

C++

1BSTR CAxGetOsVerCtrl::GetHelloWorld(void) { 2 return _T("Hello World."); 3}

BSTR型を返さなければいけないのにLPCTSTR型を返しています。
正しくは以下のようになると思います。

C++

1BSTR CAxGetOsVerCtrl::GetHelloWorld(void) { 2 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 3 4 CString strResult(_T("Hello World.")); 5 return strResult.AllocSysString(); 6}

また、上記のようにActiveXメソッドの先頭ではAFX_MANAGE_STATEマクロも使ってください。

その参考ページでは、ActiveXメソッドの追加を手動でコーデイングしてますが、やめた方が無難です。
ActiveXのメソッド、プロパティ、イベントは全てウィザードを使用して行った方が方がいいと思います。そうすれば、ディスパッチマップやidlファイルを手動で編集する必要はなくなります。

投稿2017/05/26 08:36

Harahira

総合スコア243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

U-QREIL8

2017/05/26 09:44

ありがとうございます。そんな大きな間違いがあったんですね……。頂いたコードに書き換えてみましたが、結果は同じでした。参考ページで手動編集されていた部分が原因な気もします。
guest

0

外しているかもしれませんが、Debugビルドしたocxで実行していませんか?
もしそうならReleaseビルドしたもので試してみてください。

投稿2017/05/26 08:28

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

U-QREIL8

2017/05/26 09:09

ありがとうございます。試してみましたが、Debug、Releaseの両ビルドともに同じ結果になることを確認しました。
guest

0

皆様ありがとうございました。

プロジェクトから作り直した上で、Harahira様の提示してくださったコードでやってみたところ、上手く落ちずに値が返ってきてくれました。ディスパッチマップと実際の定義の型がが違っていたのだと思います。

ちなみに以前、返値をint型にしてやってみたのですが同じような状況になったため、今回改めてディスパッチマップの記述を見直し、VT_I4型にしたところ、上手くいきました。

投稿2017/06/01 15:26

U-QREIL8

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問