2
A
回答
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」
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
相關問題
- 1. 如何在C#中使用COM ActiveX#
- 2. C#應用程序中的Web ActiveX
- 3. 使用Javascript ActiveX對象觸發C#dll
- 4. 在java中使用ActiveX
- 5. 在Qt中使用mscomm ActiveX
- 6. 獲取使用ActiveX
- 7. 在C#中編寫ActiveX控件,但在MFC中使用它
- 8. 的ReferenceError:不使用ActiveX
- 9. 使用Activex的打字稿
- 10. 啓動WINWORD使用的ActiveX
- 11. C#Activex跨平臺
- 12. 如何使用ColdFusion中的ActiveX/COM?
- 13. 裹C#代碼的ActiveX
- 14. 通過C#中的ActiveX下載文件
- 15. 在C中的ActiveX控件拖放#
- 16. InvalidCastException當在C#項目中使用ActiveX時
- 17. ActiveX不能在Asp.net C中使用本地主機#
- 18. 如何在C++中使用Javascript腳本編寫ActiveX對象
- 19. 從網頁上的其他ActiveX控件使用ActiveX控件
- 20. 從普通c代碼中調用C++ activex dll
- 21. 在Silverlight中使用ActiveX控件
- 22. 如何在PHP中使用ActiveX?
- 23. 如何在Chrome中使用ActiveX?
- 24. 如何在ASP.NET中使用ActiveX控件
- 25. 如何在java中使用ActiveX(ocx)
- 26. 在PHP中可以使用Activex嗎?
- 27. 在vC++ win32項目中使用activex dll
- 28. 如何在Reactjs中使用ActiveX?
- 29. 使用ActiveX在WPF中打開PDF
- 30. 在WinForms中使用VLC Activex插件
在IE11中崩潰 – dizel3d 2014-11-20 13:03:36