4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VBAからC#で作成されたCOMを利用する時の備忘

Posted at

もはや、枯れた技術かもしれませんが…備忘です

問題点:事前バインドで走った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。

めちゃくちゃ、はまったので誰かの役に立つといいな。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?