0

システムで MATLAB 64 ビットの使用を開始し、従来の M コードの一部でMSFlexGrid ActiveX コンポーネントのカスタム バージョンを使用しているため、.Net 64 ビット バージョンを作成することにしました。

ActiveX は、Windows フォーム ホストを介して公開されます。

[ProgId("FlexiGrid")]
[Guid("88888888-4444-4444-4444-CCCCCCCCCCCC")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public partial class GridWinFormsHost : UserControl
{
}

Windows フォーム ユーザー コントロールは、ElementHost を介して WPF UserControl を埋め込みます。

    private IGrid grid;

    private void GridWinFormsHostLoad(object sender, System.EventArgs e)
    {
        var host = new ElementHost { Dock = DockStyle.Fill };
        this.grid = new GridView();
        host.Child = (GridView)this.grid;
        this.Controls.Add(host);
    }

コントロールは正常に登録され、MATLAB に表示され、次の方法でインスタンス化できます。

actxcontrol('FlexiGrid', Position, Fig, CallBack);

GridWinForms で公開されているメソッドとプロパティは表示され、取得/設定/呼び出しが可能です。

ただし、ActiveX をインスタンス化した後、最終的には MATLAB プロセスで MEX DLL を介して .Net を呼び出す必要があります。呼び出しは .Net で正常に実行されますが、制御が .Net から戻ると MATLAB プロセスがフリーズします。ActiveX コントロールをインスタンス化せずに同じコードを実行すると成功し、MATLAB はフリーズしません。つまり、.Net ActiveX コントロールのインスタンス化が MATLAB のフリーズの原因である可能性があります。

解決策を探しているときに、次のMSDN スレッドに出くわしました。「この問題は、Windows フォームが使用するメッセージ ループと、COM クライアント アプリケーションが提供するメッセージ ループが異なるために発生します。」元の投稿者は、WPF + MFC で問題を解決したと結論付けていますが、解決策については詳しく説明していません。

また、「Windows フォームを COM クライアント アプリケーションから正しく機能させるには、Windows フォーム メッセージ ループでフォームを実行する必要があります」というMSDN の記事も見つけました。これは、ソリューションが新しい Windows フォーム ウィンドウの作成に焦点を当てていることを除いて、有望ですが、MATLAB ウィンドウに埋め込まれた Windows フォーム ユーザー コントロールを実行する必要があります。

この問題は、管理されていないアプリケーションで管理されている ActiveX コントロールをホストすることに関連しているようです - 何かアイデアはありますか?

4

1 に答える 1