システムで 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 コントロールをホストすることに関連しているようです - 何かアイデアはありますか?