您好我有以下用于配置活动x组件的c#代码
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Microsoft.Win32;
namespace Kosmala.Michal.ActiveXTest
{
/// <summary>
/// Summary description for Class1.
/// </summary>
[ProgId("Dendrite.WebForce.MMP.Web.OurActiveX")]
[ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(ControlEvents))] //Implementing interface that will be visible from JS
[Guid("121C3E0E-DC6E-45dc-952B-A6617F0FAA32")]
[ComVisible(true)]
public class ActiveXObject
{
private string myParam = "Empty";
public ActiveXObject()
{
}
public event ControlEventHandler OnClose;
/// <summary>
/// Opens application. Called from JS
/// </summary>
[ComVisible(true)]
public void Open()
{
//TODO: Replace the try catch in aspx with try catch below. The problem is that js OnClose does not register.
try
{
MessageBox.Show(myParam); //Show param that was passed from JS
Thread.Sleep(2000); //Wait a little before closing. This is just to show the gap between calling OnClose event.
Close(); //Close application
}
catch (Exception e)
{
//ExceptionHandling.AppException(e);
throw e;
}
}
/// <summary>
/// Parameter visible from JS
/// </summary>
[ComVisible(true)]
public string MyParam
{
get
{
return myParam;
}
set
{
myParam = value;
}
}
[ComVisible(true)]
public void Close()
{
if(OnClose != null)
{
OnClose("http://otherwebsite.com"); //Calling event that will be catched in JS
}
else
{
MessageBox.Show("No Event Attached"); //If no events are attached send message.
}
}
/// <summary>
/// Register the class as a control and set it's CodeBase entry
/// </summary>
/// <param name="key">The registry key of the control</param>
[ComRegisterFunction()]
public static void RegisterClass ( string key )
{
// Strip off HKEY_CLASSES_ROOT\ from the passed key as I don't need it
StringBuilder sb = new StringBuilder ( key ) ;
sb.Replace(@"HKEY_CLASSES_ROOT\","") ;
// Open the CLSID\{guid} key for write access
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(),true);
// And create the 'Control' key - this allows it to show up in
// the ActiveX control container
RegistryKey ctrl = k.CreateSubKey ( "Control" ) ;
ctrl.Close ( ) ;
// Next create the CodeBase entry - needed if not string named and GACced.
RegistryKey inprocServer32 = k.OpenSubKey ( "InprocServer32" , true ) ;
inprocServer32.SetValue ( "CodeBase" , Assembly.GetExecutingAssembly().CodeBase ) ;
inprocServer32.Close ( ) ;
// Finally close the main key
k.Close ( ) ;
MessageBox.Show("Registered");
}
/// <summary>
/// Called to unregister the control
/// </summary>
/// <param name="key">Tke registry key</param>
[ComUnregisterFunction()]
public static void UnregisterClass ( string key )
{
StringBuilder sb = new StringBuilder ( key ) ;
sb.Replace(@"HKEY_CLASSES_ROOT\","") ;
// Open HKCR\CLSID\{guid} for write access
RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(),true);
// Delete the 'Control' key, but don't throw an exception if it does not exist
k.DeleteSubKey ( "Control" , false ) ;
// Next open up InprocServer32
//RegistryKey inprocServer32 =
k.OpenSubKey ( "InprocServer32" , true ) ;
// And delete the CodeBase key, again not throwing if missing
k.DeleteSubKey ( "CodeBase" , false ) ;
// Finally close the main key
k.Close ( ) ;
MessageBox.Show("UnRegistered");
}
}
/// <summary>
/// Event handler for events that will be visible from JavaScript
/// </summary>
public delegate void ControlEventHandler(string redirectUrl);
/// <summary>
/// This interface shows events to javascript
/// </summary>
[Guid("68BD4E0D-D7BC-4cf6-BEB7-CAB950161E79")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ControlEvents
{
//Add a DispIdAttribute to any members in the source interface to specify the COM DispId.
[DispId(0x60020001)]
void OnClose(string redirectUrl); //This method will be visible from JS
}
}
我创建了测试页.html为
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<html>
<head>
<title>WebForm1</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body onload="OpenActiveX()">
<!-- Our activeX object -->
<OBJECT id="OurActiveX" name=”OurActiveX" classid="clsid:121C3E0E-DC6E-45dc-952B-A6617F0FAA32" VIEWASTEXT codebase="OurActiveX.cab"></OBJECT>
<!-- Attaching to an ActiveX event-->
<script language="javascript">
function OurActiveX::OnClose(redirectionUrl)
{
alert(redirectionUrl); <!-- http://otherwebsite.com should be returned-->
//window.location = redirectionUrl;
}
</script>
<script language="javascript">
//Passing parameters to ActiveX object and starting application
function OpenActiveX()
{
try
{
document.OurActiveX.MyParam = "Hi I am here." //Passing parameter to the ActiveX
document.OurActiveX.Open(); //Running method from activeX
}
catch(Err)
{
alert(Err.description);
}
}
</script>
</body>
</html>
现在,当我在Internet Explorer浏览器中运行html页面时,我收到以下错误
对象不支持属性或方法打开
你可以帮我解决这些问题等待您的宝贵意见和回复
答案 0 :(得分:2)
在IE中打开测试页,从工具栏上的工具按钮打开Internet选项(在IE9中),选择安全页面,点击自定义按钮,向下滚动到“ActiveX控件和插件”部分。您可以在此处启用ActiveX控件的提示/启用以及脚本编写。
默认情况下,IE中会阻止未签名的ActiveX控件,并且已签名的ActiveX控件将引发提示。
答案 1 :(得分:1)
我会尝试取消注册DLL,更改GUID,然后重新注册您的课程。由于设置MyParam
会出现,因此可能会在以后添加Open()
,并且接口定义不会重新注册。
答案 2 :(得分:1)
您必须使用注册ActiveX控件 Microsoft .Net Framework regasm.exe 工具。
要注册ActiveX控件,请使用以下步骤:
输入以下命令
regasm.exe / tlb / codebase“ActiveX.dll的路径”
请注意,如果您在x64位操作系统上运行 您必须为x86和x64注册ActiveX控件 IE浏览器。 对于x64 Internet Explorer,您必须导航到 您要定位的.Net Framework的x64目录 执行以下命令:
regasm.exe / tlb / codebase“x64 ActiveX.dll的路径”
在注册ActiveX dll期间,您应该看到一个消息框 消息“已注册”。请不要,如果您使用平台目标“任何CPU”编译您的dll 您可以使用相同的dll进行注册。
答案 3 :(得分:0)
从方法名称中删除静态,你就可以了!!