문제

ActiveX 인터페이스를 사용하여 .NET 사용자 컨트롤을 만들었습니다. 잘 작동한다.

이제 ActiveX 인터페이스의 속성 백에서 읽고 쓸 수 있기를 원합니다.

어떻게할까요?

도움이 되었습니까?

해결책

가장 쉬운 것은 클라이언트 스크립트를 사용하여 매개 변수 값을 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>

클라이언트 스크립트를 사용할 수없는 경우 다음과 같은 방법을 시도 할 수 있습니다.

다음과 같은 매개 변수를 읽으려고한다고 가정 해 봅시다.

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

프로젝트에서 다음 COM 인터페이스를 노출해야합니다.

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

ActiveX 컨트롤은 이러한 인터페이스를 구현해야합니다. 구현 해야하는 방법은 하나입니다.

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

덕! 매개 변수는 "valuetoretrieve"와 같아야합니다.

다른 팁

C# ActiveX가 객체 태그에서 Param 속성을 받도록하려고했습니다.

여기서 제안 된 솔루션을 사용하려고했는데 객체를로드 할 때 IE 충돌이 발생했습니다.

마지막으로 다른 ipropertybag 및 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);
}

그런 다음 다음과 같은로드 방법을 구현했습니다.

#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

그리고 그것은 효과가있었습니다.

이것이 같은 상황에서 누군가를 도울 수 있기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top