もはや、枯れた技術かもしれませんが…備忘です
問題点:事前バインドで走ったCOMが遅延バインドで動かない
ACCESSS VBA 32bit版から、C#で作成したCOMを利用していましたが、C#で32bit64bit互換のCOMを作成できるようだし、64bitへの移行も考えて、VBAで遅延バインドに変更しました。
VBAで、MyLibを追加して、MyClassを利用する際
'参照設定にMyLibを追加
Dim class1 as New MyLib.MyClass, hWnd1 as LongPtr
class1.method1(hWnd1)
とするところを
'参照設定にMyLibを追加しない
Dim class1 as Object, hWnd1 as LongPtr
Set class1 = CreateObject("MyLib.MyClass")
class1.method1(hWnd1)
としたところ、上の参照設定では動くのに、下はError 430。さらに
'参照設定にMyLibを追加
Dim class1 as New MyLib.MyClass, hWnd1 as LongPtr
Set class1 = CreateObject("MyLib.MyClass")
class1.method1(hWnd1)
これだと動く。
原因:遅延バインドではIntPtrを正しく処理できないようだ
VSでACCESSのプロセスにアタッチしたところ、mscorlibでSystem.InvalidCastExceptionとのこと。
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IMyClass
{
[DispId(1),Description("Late-Binding Not Function")]
void method1(IntPtr hWnd)
}
これを
[ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IMyClass
{
[DispId(1),Description("Both Binding Work Fine")]
void method1(dynamic hWnd)
}
で、MyClass.method1内で、(IntPrt)hWndとキャストすればOK。
めちゃくちゃ、はまったので誰かの役に立つといいな。