Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 669
Jason Avatar asked Mar 01 '23 02:03

Jason


1 Answers

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"

like image 54
teebot Avatar answered Mar 15 '23 10:03

teebot