C#开发的供IE浏览器使用的控件

 
 

使用C#开发用户控件,供IE浏览器调用,除了应用程序属性中程序集信息窗口的“使程序集COM可见”和  生成中的“为COM互操作注册”要打勾外,还要求方法/函数的返回值不能是void,COM中是一般返回HRESULT, C#中可以用int替换。

   [ComImport]
    [Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IObjectSafety
    {
        [PreserveSig]
        int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions);

        [PreserveSig()]
        int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions);
    }

    [Guid("A53DD1E5-CA43-46a8-A51E-231FF7B322E3")]
    [ProgId("TestOcx.TextFunc")]
    [ComVisible(true)] 
    public partial class TextFunc : UserControl, IObjectSafety
    {

        #region IObjectSafety 成员

        private const int INTERFACESAFE_FOR_UNTRUSTED_CALLER = 0x00000001;
        private const int INTERFACESAFE_FOR_UNTRUSTED_DATA = 0x00000002;
        private const int S_OK = 0;

        [PreserveSig]
        public int GetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] ref int pdwSupportedOptions, [MarshalAs(UnmanagedType.U4)] ref int pdwEnabledOptions)
        {
            pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
            pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
            return S_OK;
        }

        [PreserveSig]
        public int SetInterfaceSafetyOptions(ref Guid riid, [MarshalAs(UnmanagedType.U4)] int dwOptionSetMask, [MarshalAs(UnmanagedType.U4)] int dwEnabledOptions)
        {
            return S_OK;
        }

        #endregion

        public TextFunc()
        {
            InitializeComponent();
        }

        public int ShowText(string strText)
        {
            MessageBox.Show(strText);
            return S_OK;
        }
    }

如何方法返回为void,则IE调用该控件为ActiveX时总找不到该方法,经多次尝试,只要不是void方法,都可以正常使用。

你可能感兴趣的:(C#,ActiveX,IObjectSafety,使程序集COM可见,为COM互操作注册)