2009-01-07 22 views

回答

4

最简单的是使用客户端脚本的参数值传递到ActiveX

<html xmlns="http://www.w3.org/1999/xhtml" > 

function Rundata(file) 
    {    
     var winCtrl = document.getElementById("YourActiveX");      
     winCtrl.Option1 = file;    
     winCtrl.WriteToFile();   
    } 

<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 

    <asp:Button runat="server" ID="Button1" OnClientClick="javascript:Rundata('valuetoRetrieve2');" /> 
</div> 
</form> 

如果您不能使用客户端脚本,你可以试试这样:

比方说,你想读的参数,如:

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

Voilà!参数应该等于“valueetoRetrieve”

+0

在IE11中崩溃 – dizel3d 2014-11-20 13:03:36

3

我试图让我的C#ActiveX接收OBJECT标记中的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 

它工作。

希望这可以帮助某人在相同的情况。

+0

不起作用,但不会使IE崩溃。 – dizel3d 2014-11-20 13:04:48