これまでの経緯
DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(1)
DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(2)
去年やってたoptclによるDataGridView埋め込みが、ようやく役に立つときが来た。
しかし、イベントを追加しようとしたところ、いきなり壁にぶち当たってしまった。
新たに定義したイベントにコールバックを登録できない。
これまでの経緯
DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(1)
DataGridViewをActiveXコントロールにラップしてTcl/Tkのウィンドウに埋め込む(2)
去年やってたoptclによるDataGridView埋め込みが、ようやく役に立つときが来た。
しかし、イベントを追加しようとしたところ、いきなり壁にぶち当たってしまった。
新たに定義したイベントにコールバックを登録できない。
前回に引き続き、イベントの定義をやってみました。
DataGridViewのボタンセルが押されたら、そのセルの行・列番号を引数にして、Tclのプロシージャをコールバックするということがしたい。
ソリューション一式: SimpleDgv.zip
まず、メソッドと別にインターフェースを用意して、InterfaceTypeをComInterfaceType.InterfaceIsIDispatchにします。
[Guid("1AE7D7D7-02EF-4d70-B7F5-71CE046FAEA9"), ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ISimpleDgvDispatch
{
void ButtonClick(int col, int row);
}
そして、クラスの属性にComSourceInterfaces(“ISimpleDgvDispatch”)を追加し、クラスにButtonClickイベントを定義します。
[Guid("29E1BC35-88D3-47f0-997D-B889CA25E135"), ComVisible(true), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ISimpleDgvDispatch))]
public partial class SimpleDgv : UserControl, ISimpleDgvInteface
{
public delegate void ButtonClickDelegate(int col, int row);
public event ButtonClickDelegate ButtonClick;
protected void OnButtonClick(int col, int row)
{
if (ButtonClick != null)
{
ButtonClick(col, row);
}
}
}
ビルドするとCOMとして公開されました。
Tcl側のコード
proc ButtonClick {col row} {
tk_messageBox -type ok -message "Callback Col=$col, Row=$row"
}
optcl::bind $dgvObj ButtonClick ButtonClick
さあ、どうでしょう?
イベントを実行したC#側で例外が発生しました。例外テキストからはSystem.RuntimeType.InvokeDispMethodに渡されるcultureが不明なものであったということだろうと解釈できますが、だからといってどうすればよいというのでしょう?
DISP_E_UNKNOWNLCIDとはなんぞや?ググっても文字通りの説明しか出てきません。
AssemblyInfo.csでCultureInfoを指定したりもしてみたが、何も変わらない。
これで丸1日試行錯誤したものの、全く原因も解決法も分からず途方にくれました。
どうしよう。引っ込みがつかない。
2009/9/8 -- 追記: 成功
.Net Framework フォーラムで質問したらjzkeyさんが回答をくれました。
動くようになったoptclのバイナリとソースを置いておきます。
http://yyamasak.drivehq.com/devel/src/tcl/lib/optcl3010t-bin.zip
http://yyamasak.drivehq.com/devel/src/tcl/lib/optcl3010t-src.zip
optclがビルドできるようになったので、とりあえずBase64でのやり取りで妥協したマルチバイト引数の件も調べれば何とかなるかもしれないという希望が出てきました。