gpt4 book ai didi

c# - 使用 c# 运行带有 activex 对象的 dll

转载 作者:行者123 更新时间:2023-11-29 18:26:19 25 4
gpt4 key购买 nike

您好,我有以下用于将事件 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
}
}

并且我创建了 testpage .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 页面时,出现以下错误

对象不支持属性或方法打开

你能帮我解决这些问题吗

等待您宝贵的意见和回复

最佳答案

您必须使用以下方式注册您的 ActiveX 控件Microsoft .Net Framework regasm.exe 工具。

要注册您的 ActiveX 控件,请使用以下步骤:

  1. 打开命令提示符。
  2. 浏览 .Net 框架的安装目录您的目标(例如 c:\windows\Microsoft.NET\Framework)
  3. 输入以下命令

    regasm.exe/tlb/codebase “您的 ActiveX.dll 的路径”

  4. 请注意,如果您运行的是 x64 位操作系统您必须为 x86 和 x64 注册您的 ActiveX 控件IE浏览器。对于 x64 Internet Explorer,您必须导航到您定位的 .Net Framework 的 x64 目录和执行以下命令:

    regasm.exe/tlb/codebase “你的 x64 ActiveX.dll 的路径”

在您的 ActiveX dll 注册过程中,您应该会看到一个消息框消息“已注册”。请不要,如果你用平台目标“任何CPU”编译你的dll您可以使用相同的 dll 进行注册。

关于c# - 使用 c# 运行带有 activex 对象的 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12749921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com