none
ATL「Fire_イベント名」のメソッドの実行方法について RRS feed

  • 質問

  • ActiveXコントロールからのイベントをJavaScriptで受け取る(コールバック)
    方法を以下のサイトを参考にしてプログラミングしています。
    ATLコントロールの「接続ポイントの実装」フェーズで、
    [接続ポイントの追加]を行うと「Fire_イベント名」のメソッドが
    自動作成されます。
    ※参考サイトでは、_ISampleControlEvents_CP.hに自動作成
    現在、この「Fire_イベント名」メソッドを他のクラス(CSampleControl以外のクラス)
    から実行することができません。エラーになります。
    他のクラスから実行する為には、どうしたら良いのでしょうか。
    初歩的な質問で申し訳ございません。
    解決方法がお分かりの方がおられましたら、アドバイスを頂きたいと思います。




    • 編集済み mk5 2011年4月11日 21:12
    2011年4月11日 15:04

回答

  • 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
    2011年4月14日 13:50
    モデレータ

すべての返信

  • どういったシチュエーションかわかりませんが、たとえば、CSampleControl に public なメンバー関数を追加して、その関数の中で Fire すればよいのでは。
    ただ、その依存関係が適当なのかどうかわかりかねますが。(設計的によいかとか)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2011年4月11日 15:48
    モデレータ
  • Azuleanさん、お返事ありがとうございます。


    私が実現したいシステム内容は、
    「ActiveXがソケット通信でデータ受信時に、Fire_イベントを使って
    JavaScriptにイベントを受け渡す」
    ことです。

    Fire_イベントを実行の為に、CSampleControlにpublicなメンバー関数を追加し、
    他のクラス(ソケット受信クラス)からこのメンバー関数を呼ぶようにしましたが、
    インスタンスの時に
    「Error:抽象クラス型"CSampleControl"のオブジェクトは使用できません」
    のエラーメッセージがでます。


    CSampleControl* m_sc;
    m_sc = new CSampleControl; ←ここでエラー


    抽象クラスというエラーが出ているので、
    CSampleControlクラスの派生クラスを作成し、その派生クラスに対して
    同様のインスタンスを行いましたが、同じエラーがでます。

    他のクラスからCSampleControl のpublicメンバー関数を呼ぶ方法について
    何かお分かり方がおられましたアドバイスを頂けないでしょうか。
    宜しくお願い致します。

    環境:VC++ 2010
    2011年4月12日 14:20
  • 改めて質問です。

    結局のところ、ATLコントロールクラスは他のクラスから

    呼ぶことはできないのでしょうか?

    (インスタンスができないので)

     

    JavaScriptからATLコントロールクラスの関数は呼ぶことができるので、

    これと同じように他のクラスからATLコントロールクラスの関数を

    呼ぶことはできないでしょうか?

    (イベントを発生、またはSendMessageなど。)

     

    情報お持ちの方、宜しくお願いします。

     

    2011年4月14日 12:18
  • 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
    2011年4月14日 13:50
    モデレータ
  • Azuleanさん

    お返事ありがとうございました。

    とりあえず、インスタンスを渡す方法で実現はできました。

    また宜しくお願いします。

     

    2011年4月14日 16:05