Search code examples
interopactivexpropertybag

Using ActiveX PropertyBags from C#


I have created a .NET user control with an ActiveX interface. It works well.

Now, I want to be able to read and write from the property bag for the ActiveX interface.

How would I do this?


Solution

  • The easiest is to use client script to pass the parameters values to the ActiveX

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
    <title></title>
    <script language="javascript">
    
        function Rundata(file) 
        {            
            var winCtrl = document.getElementById("YourActiveX");                     
            winCtrl.Option1 = file;             
            winCtrl.WriteToFile();        
        }
    </script>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
        <object id="YourActiveX" classid="clsid:6b1bdf22-1c1d-774e-cd9d-1d1aaf7fd88f" 
        width="300px" height="200px">
        <param name="Option1" value="valuetoRetrieve1" />
        </object>
    
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    
        <asp:Button runat="server" ID="Button1" OnClientClick="javascript:Rundata('valuetoRetrieve2');" />
    </div>
    </form>
    </body>
    </html>
    

    If you can't use client script, you can try that way:

    Let's say you want to read a parameter such as:

    <object id="YourActiveX" classid="clsid:6b1bdf22-1c1d-774e-cd9d-1d1aaf7fd88f" 
        width="300px" height="200px">
        <param name="option1" value="valuetoRetrieve" />
        </object>
    

    You need to expose the following COM interfaces in your project:

    [ComImport]
    [Guid("55272A00-42CB-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    public interface IPropertyBag
    {
        void Write([InAttribute] string propName, [InAttribute] ref Object ptrVar);
        void Read([InAttribute] string propName, out Object ptrVar, int errorLog);
    }
    
    [ComImport]
    [Guid("37D84F60-42CB-11CE-8135-00AA004BB851")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IPersistPropertyBag
    {
    
        [PreserveSig]
        void InitNew();
    
        [PreserveSig]
        void Load(IPropertyBag propertyBag, int errorLog);
    
        [PreserveSig]
        void Save(IPropertyBag propertyBag, [InAttribute] bool clearDirty, [InAttribute] bool saveAllProperties);
    
        [PreserveSig]
        void GetClassID(out Guid classID);
    }
    

    Your activeX control should implement these interfaces. There's one method you need to implement :

    void IPersistPropertyBag.Load(IPropertyBag propertyBag, int errorLog) 
        {
            object value; 
            propertyBag.Read("option1", out value, errorLog);  
            string parameter = (string)value;
        }
    

    Voilà! parameter should be equal to "valuetoRetrieve"