none
スレッド実行している処理から、ActiveX Controlを用いたAPIを呼び出す方法 RRS feed

  • 質問

  • VC++で作成したMFCプログラムがあり、以下のような構成になっています。

    プログラム構成図

    ここでDLL内でスレッド実行している「処理A」の中から、ActiveX Controlを使ったAPIを使いたいので、
    処理A内にモードレスダイアログを用意し、そのダイアログ内にActiveX Controlを埋め込み、
    APIを利用しようとしたのですが、うまくいきません。
    処理Aで、ActiveX Controlを埋め込んだモードレスダイアログをCreateすると、メモリアクセス違反で
    プログラムが停止してしまいます。

    処理A内から、ActiveX Controlを使ったAPIを呼び出す方法はあるのでしょうか。

    なお、
    ・上記の図で示した構成は既存のものなので、大幅な構成変更は現実的には難しいです。
    ・このAPIは他社製品のものなので、API自体の改造はできません。
    ・この処理はバックグラウンドで行いたいので、画面応答の必要がない方法であることが前提です。
     (すなわち、モーダルダイアログを用いることはできません。)

    2020年8月17日 6:01

すべての返信

  • 処理 A を実行するスレッドは、STA/MTA どちらで初期化されているのでしょうか?
    もし、初期化をしていないのであれば、CoInitializeEx で初期化してみる、STA で初期化してみるというのは、最初に試す手だと思います。
    2020年8月17日 13:14
    モデレータ
  • ActiveX Control というと、スレッドモデルは、アパートメントスレッドになっているとおもいます。

    処理Aのスレッドは、UIスレッドになっているでしょうか?何らかのウィンドウを出す場合、そのスレッドはUIスレッドとして動作するように作ってある必要があります。
    具体的には、CWinThread::Run() 相当のメッセージループを持つスレッドということになります。

    もし、APIにコールバック処理があるのであれば、メインスレッド側でAPIを呼び出す形にしておき、適宜メッセージポンプを動かしながらUIを回すという方法もあります。
    昨年のわんくま勉強会でしゃべてるので、参考になるかわかりませんが、当日の資料とサンプルソースを張り付けておきます。

    https://github.com/Tocchann/Yokohama12



    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    2020年8月18日 10:46
  • ashiya3_001さん、こんにちは。フォーラムオペレーターのKumoです。 
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    ご質問いただいた件ですが、その後いかがでしょうか。

    参考になった投稿には [回答としてマーク] をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    お手数ですが、ご協力の程どうかよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年8月20日 5:37
    モデレータ