トップ回答者
ATL「Fire_イベント名」のメソッドの実行方法について

質問
-
ActiveXコントロールからのイベントをJavaScriptで受け取る(コールバック)方法を以下のサイトを参考にしてプログラミングしています。ATLコントロールの「接続ポイントの実装」フェーズで、[接続ポイントの追加]を行うと「Fire_イベント名」のメソッドが自動作成されます。※参考サイトでは、_ISampleControlEvents_CP.hに自動作成現在、この「Fire_イベント名」メソッドを他のクラス(CSampleControl以外のクラス)から実行することができません。エラーになります。他のクラスから実行する為には、どうしたら良いのでしょうか。初歩的な質問で申し訳ございません。解決方法がお分かりの方がおられましたら、アドバイスを頂きたいと思います。
- 編集済み mk5 2011年4月11日 21:12
回答
-
CSampleControl* m_sc;
m_sc = new CSampleControl; ←ここでエラー書いているコードの意味を理解するようにしてください。
たとえ、このコードがエラーにならなくても、JavaScript にイベントは伝わりません。
なぜなら、JavaScript が利用している CSampleControl のインスタンスと m_sc に代入されるインスタンスは別物ですから、m_sc でイベントを発動させても、JavaScript とは全く関係のない呼び出しになります。# インスタンスが違うとなぜ伝わらないかがわからない場合は、ActiveX コントロール云々よりも、
# クラスとインスタンスに関して再勉強が必要だと思われます。
# 短期的には時間がかかりますが、長期的な視点では不具合を減らせるなどの利点につながると思われます。① 結局のところ、ATLコントロールクラスは他のクラスから
呼ぶことはできないのでしょうか?
(インスタンスができないので)インスタンスを作ることができないということが、そのクラスが利用できないことにはつながりません。
② JavaScriptからATLコントロールクラスの関数は呼ぶことができるので、
これと同じように他のクラスからATLコントロールクラスの関数を
呼ぶことはできないでしょうか?
(イベントを発生、またはSendMessageなど。)SendMessage で伝えるためにウィンドウハンドルを渡してよいですし、メンバー関数を呼ぶためにインスタンスを渡してもよいでしょう。
呼び出し元にイベントを伝えたいのであれば、そのインスタンス自身か、そのインスタンスに伝えるためのウィンドウハンドルかのいずれかは必要になります。
面倒でも引数で渡していくなどの手を取ってください。# インスタンスを渡す場合、相互参照の関係になるのであまりよいとは言えないかもしれませんね。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見- 回答としてマーク mk5 2011年4月14日 16:01
すべての返信
-
Azuleanさん、お返事ありがとうございます。
私が実現したいシステム内容は、「ActiveXがソケット通信でデータ受信時に、Fire_イベントを使ってJavaScriptにイベントを受け渡す」ことです。
Fire_イベントを実行の為に、CSampleControlにpublicなメンバー関数を追加し、他のクラス(ソケット受信クラス)からこのメンバー関数を呼ぶようにしましたが、インスタンスの時に「Error:抽象クラス型"CSampleControl"のオブジェクトは使用できません」のエラーメッセージがでます。
CSampleControl* m_sc;m_sc = new CSampleControl; ←ここでエラー
抽象クラスというエラーが出ているので、CSampleControlクラスの派生クラスを作成し、その派生クラスに対して同様のインスタンスを行いましたが、同じエラーがでます。
他のクラスからCSampleControl のpublicメンバー関数を呼ぶ方法について何かお分かり方がおられましたアドバイスを頂けないでしょうか。宜しくお願い致します。
環境:VC++ 2010 -
CSampleControl* m_sc;
m_sc = new CSampleControl; ←ここでエラー書いているコードの意味を理解するようにしてください。
たとえ、このコードがエラーにならなくても、JavaScript にイベントは伝わりません。
なぜなら、JavaScript が利用している CSampleControl のインスタンスと m_sc に代入されるインスタンスは別物ですから、m_sc でイベントを発動させても、JavaScript とは全く関係のない呼び出しになります。# インスタンスが違うとなぜ伝わらないかがわからない場合は、ActiveX コントロール云々よりも、
# クラスとインスタンスに関して再勉強が必要だと思われます。
# 短期的には時間がかかりますが、長期的な視点では不具合を減らせるなどの利点につながると思われます。① 結局のところ、ATLコントロールクラスは他のクラスから
呼ぶことはできないのでしょうか?
(インスタンスができないので)インスタンスを作ることができないということが、そのクラスが利用できないことにはつながりません。
② JavaScriptからATLコントロールクラスの関数は呼ぶことができるので、
これと同じように他のクラスからATLコントロールクラスの関数を
呼ぶことはできないでしょうか?
(イベントを発生、またはSendMessageなど。)SendMessage で伝えるためにウィンドウハンドルを渡してよいですし、メンバー関数を呼ぶためにインスタンスを渡してもよいでしょう。
呼び出し元にイベントを伝えたいのであれば、そのインスタンス自身か、そのインスタンスに伝えるためのウィンドウハンドルかのいずれかは必要になります。
面倒でも引数で渡していくなどの手を取ってください。# インスタンスを渡す場合、相互参照の関係になるのであまりよいとは言えないかもしれませんね。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見- 回答としてマーク mk5 2011年4月14日 16:01