IDocHostUIHandler

.NET 2.0 になり、アンマネージドとの相互変換時の変数型の定義を明確にしないと、InvalidVariant MDA メッセージが投げられるようになった。動作確認した定義は以下の通り。

using System;
using System.Runtime.InteropServices;
using MSHTML;

namespace net.tilfin
{
    [ComImport(),
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
    GuidAttribute("bd3f23c0-d43e-11cf-893b-00aa00bdce1a")]
    public interface IDocHostUIHandler
    {
        [PreserveSig]
        uint ShowContextMenu(
            uint dwID,
            ref tagPOINT ppt,
            [MarshalAs(UnmanagedType.IUnknown)]  object pcmdtReserved,
            [MarshalAs(UnmanagedType.IDispatch)] object pdispReserved
        );

        void GetHostInfo(ref DOCHOSTUIINFO pInfo);

        void ShowUI(uint dwID,
            [In, MarshalAs(UnmanagedType.Interface)] IOleInPlaceActiveObject activeObject,
            [In, MarshalAs(UnmanagedType.Interface)] IOleCommandTarget commandTarget,
            [In, MarshalAs(UnmanagedType.Interface)] IOleInPlaceFrame frame,
            [In, MarshalAs(UnmanagedType.Interface)] Object doc);

        void HideUI();

        void UpdateUI();

        void EnableModeless(int fEnable);

        void OnDocWindowActivate(int fActivate);

        void OnFrameWindowActivate(int fActivate);

        void ResizeBorder(ref tagRECT prcBorder, int pUIWindow, int fFrameWindow);

        [PreserveSig]
        uint TranslateAccelerator(ref tagMSG lpMsg, ref Guid pguidCmdGroup, uint nCmdID);

        void GetOptionKeyPath([MarshalAs(UnmanagedType.BStr)] ref string pchKey, uint dw);

        void GetDropTarget(
            [MarshalAs(UnmanagedType.Interface)] IDropTarget pDropTarget,
            [Out, MarshalAs(UnmanagedType.Interface)] out IDropTarget ppDropTarget);

        void GetExternal([MarshalAs(UnmanagedType.IDispatch)] out object ppDispatch);

        [PreserveSig]
        uint TranslateUrl(
            uint dwTranslate,
            [MarshalAs(UnmanagedType.BStr)] string pchURLIn,
            [MarshalAs(UnmanagedType.BStr)] ref string ppchURLOut
        );

        System.Windows.Forms.IDataObject FilterDataObject(System.Windows.Forms.IDataObject pDO);
    }
}