Pregunta

He creado un control de usuario .NET con una interfaz ActiveX. Funciona bien.

Ahora, quiero poder leer y escribir desde la bolsa de propiedades para la interfaz ActiveX.

¿Cómo haría esto?

¿Fue útil?

Solución

Lo más fácil es usar el script del cliente para pasar los valores de los parámetros al 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>

Si no puedes usar el script del cliente, puedes intentarlo de esa manera:

Supongamos que desea leer un parámetro como:

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

Debe exponer las siguientes interfaces COM en su proyecto:

[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);
}

Su control activeX debería implementar estas interfaces. Hay un método que necesitas implementar:

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

Voilà! el parámetro debe ser igual a " valuetoRetrieve "

Otros consejos

Estaba tratando de hacer que mi C # ActiveX recibiera las propiedades PARAM en una etiqueta OBJECT.

Traté de usar la solución propuesta aquí, y encontré que IE fallaba al cargar mi objeto ...

Finalmente pude hacerlo bien usando diferentes interfaces IPropertyBag e IPersistPropertyBag:

[ComVisible(true), ComImport, 
Guid("0000010C-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersist
{
    [PreserveSig]
    int GetClassID([Out] out Guid pClassID);
}

[ComVisible(true), ComImport,
Guid("37D84F60-42CB-11CE-8135-00AA004BB851"),//Guid("5738E040-B67F-11d0-BD4D-00A0C911CE86"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistPropertyBag : IPersist
{
    #region IPersist
    [PreserveSig]
    new int GetClassID([Out] out Guid pClassID);
    #endregion

    [PreserveSig]
    int InitNew();

    [PreserveSig]
    int Load(
    [In] IPropertyBag pPropBag,
    [In, MarshalAs(UnmanagedType.Interface)] object pErrorLog
    );

    [PreserveSig]
    int Save(
    IPropertyBag pPropBag,
    [In, MarshalAs(UnmanagedType.Bool)] bool fClearDirty,
    [In, MarshalAs(UnmanagedType.Bool)] bool fSaveAllProperties
    );
}

[ComVisible(true), ComImport,
Guid("55272A00-42CB-11CE-8135-00AA004BB851"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPropertyBag
{
    [PreserveSig]
    int Read(
    [In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName,
    [In, Out, MarshalAs(UnmanagedType.Struct)]    ref    object pVar,
    [In] IntPtr pErrorLog);

    [PreserveSig]
    int Write(
    [In, MarshalAs(UnmanagedType.LPWStr)] string pszPropName,
    [In, MarshalAs(UnmanagedType.Struct)] ref object pVar);
}

Luego implementé los métodos de carga de esta manera:

#region IPropertyBag Members

    public int Read(string pszPropName, ref object pVar, IntPtr pErrorLog)
    {
        pVar = null;
        switch (pszPropName)
        {
            case "FileType": pVar = _fileType; break;
            case "WebServiceUrl": pVar = _webServiceUrl; break;
            case "Language": pVar = _language; break;
        }

        return 0;
    }

    public int Write(string pszPropName, ref object pVar)
    {
        switch (pszPropName)
        {
            case "FileType": _fileType = (string)pVar; break;
            case "WebServiceUrl": _webServiceUrl = (string)pVar; break;
            case "Language": _language = (string)pVar; break;
        }

        return 0;
    }

    #endregion

    #region IPersistPropertyBag Members

    public int GetClassID(out Guid pClassID)
    {
        throw new NotImplementedException();
    }

    public int InitNew()
    {
        return 0;
    }

    public int Load(IPropertyBag pPropBag, object pErrorLog)
    {
        object val = null;

        pPropBag.Read("FileType", ref val, IntPtr.Zero);
        Write("FileType", ref val);

        pPropBag.Read("WebServiceUrl", ref val, IntPtr.Zero);
        Write("WebServiceUrl", ref val);

        pPropBag.Read("Language", ref val, IntPtr.Zero);
        Write("Language", ref val);

        return 0;
    }

    public int Save(IPropertyBag pPropBag, bool fClearDirty, bool fSaveAllProperties)
    {
        return 0;
    }

    #endregion

Y funcionó.

Espero que esto pueda ayudar a alguien en la misma situación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top