2009-01-07 50 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