Pergunta

Eu criei um controle de usuário .NET com uma interface ActiveX. Ele funciona bem.

Agora, eu quero ser capaz de ler e escrever a partir do saco de propriedades para a interface ActiveX.

Como eu faria isso?

Foi útil?

Solução

O mais fácil é usar o script de cliente para passar os valores dos parâmetros para o 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>

Se você não pode usar o script de cliente, você pode tentar dessa forma:

Vamos dizer que você quer ler um parâmetro tais como:

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

Você precisa expor os seguintes interfaces COM em seu projeto:

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

Seu controle ActiveX deve implementar essas interfaces. Há um método que você precisa para implementar:

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

Voilà! parâmetro deve ser igual a "valuetoRetrieve"

Outras dicas

Eu estava tentando fazer o meu # ActiveX C receber as propriedades PARAM em uma etiqueta de objecto.

Eu tentei usar a solução aqui proposta, e eu achei IE falhando quando carregar meu objeto ...

Finalmente eu poderia obtê-lo direito, utilizando diferentes interfaces de 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);
}

Então eu implementados os métodos de carga como este:

#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

E funcionou.

Espero que isso pode ajudar alguém na mesma situação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top