好的,虽然我从未想过在2012年我会编写我的第一个ActiveX控件(是的,这是有充分理由的)我正在努力让它在Windows 7(x64)下运行。
解决方案简短故事:我在某些regasm调用中丢失/代码库,并且还混合了32位和64位进程,但标准VS2010命令没有帮助提示为regasm和cscript混合32位和64位路径。
长篇故事如下:
我在
之间蹦蹦跳跳<击> Creating an ActiveX control in .Net using C# 击>
(哎呀我的链接错误..虽然看起来我最初提供的链接是有人复制原始博客页面)
Creating an ActiveX control in .Net using C#
和
C# ActiveX control (CSActiveX)
我似乎正在成功构建项目(对于后者,我必须将资源编译器位置更改为正确的位置)。
对于我使用建议的安装程序的第一个项目,对于第二个项目,我试图直接使用regasm。
但在此之后,一切都下山了。我尝试注册所有的,但是:
我的测试用例是一个包含
的简单JScript文件var x = new ActiveXObject( "name of object" );
哪个失败并显示错误:
test.js(1,1)Microsoft JScript运行时错误:Automation Server无法创建对象
我不确定这是权限问题,还是32位与64位问题或组合。
许多提供ActiveX帮助的网站假设您将通过网页访问它,所以我尝试查看IE权限(即使我想将控件加载到第三方程序中)。
我知道我是否使用了&#39;框架&#39;或者&#39; framework64&#39; regasm的版本我可以控制注册表项中的位置 - 我已经看到一些引用运行cscript作为32位或64位(这可能影响注册表的哪个部分被搜索),具体取决于调用的cmd shell(和我尝试了两种方式,以及尝试一个&#34;管理员&#34; shell)。
所以基本上在这一点上我不知道我在做什么或者我应该做什么。
我的目标是在Windows 7 x64上注册一个ActiveX控件,并让它能够通过以下方式加载:
备注
对于使用安装程序的项目(使用C#在.Net中创建ActiveX控件),它会将代码安装到&#34; c:\ program Files(x86)\&#34;并使用注册表查找条目&#34;计算机\ HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID \&#34;我相信它告诉我DLL是作为32位进程安装的。我尝试从32位和64位cmd运行我的cscript测试,但它们都失败了。请注意,安装程序正在创建等同于&#34; regasm / codebase&#34;什么时候跑。
对于我尝试使用regasm注册它的项目(C#ActiveX控件(CSActiveX)),它有一些用于注册ActiveX COM控件的附加代码。此代码提到注册32位进程内服务器(请参阅ActiveXCtrlHelpers.cs)
(顺便说一句,我现在也在Safari / Lion中诅咒自动纠正,不断改变小写&#34; DLL&#34;进入&#34;所有&#34;)
修改2012-08-07
我发现Art的答案提示:
从标准VS2010命令提示符
运行&#39; regasm / codebase&#39;通过标准的VS2010命令提示符(以及管理员允许regasm执行更改),条目被转储到HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID下的注册表中,并且测试脚本在同一提示符下失败。
但是我可以在Excel 2007(32位)中看到ActiveX控件
从x64 Win64 VS2010命令提示符
在VS2010 x64 Win64命令提示符下运行时(再次作为管理员),注册表项出现在HKEY_CLASSES_ROOT \ CLSID下,但这次测试脚本在同一提示下工作,也来自标准Windows cmd提示符(但是它们从32位提示)
但是!!我无法从Excel 2007(32位)
中看到活动的X控件 现在我只需要弄清楚* nix&#39;的哪些窗口相当于&#39;命令,以确保我使用哪个regasm)&#39; where&#39;命令
查看VS2010和Windows 7命令提示符:
VS2010 (standard prompt): cscript => c:\windows\system32\cscript.exe
regasm => c:\windows\Microsoft.net\framework\v4.0.30319\regasm.exe
VS2010 (x64 Win 64): cscript => c:\windows\system32\cscript
regasm => c:\windows\Microsoft.net\framework64\v4.0.30319\regasm.exe
Windows 7 std. prompt: cscript => c:\windows\system32\cscript.exe
Windows 7 32 bit prompt: cscript => c:\windows\SysWOW64\cscript.exe
这一切都开始使我的一些困惑可以理解。我一直在不知不觉地混合和匹配32位和64位系统,但VS2010标准提示也没有帮助!
(以及我的最新版本 - VS2010将文件保存为带BOM的UTF-8)
答案 0 :(得分:1)
通过执行以下操作,我能够通过IE和vbscript完成这项工作:
添加一个名为MyObject的类,其定义如下:
namespace ActiveXTest
{
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ProgId("ActiveXTest.MyObject")]
[System.Runtime.InteropServices.Guid("df2dac4d-ba8a-4ecc-b76e-958c1bc32f1f")]
public class MyObject
{
public string HelloWorld()
{
return "This is Hello World from the COM component!";
}
}
}
编译课程。转到编译该类的文件夹,并从Visual Studio命令提示符处执行以下操作:regasm / codebase ActiveXTest.dll
要从.vbs脚本进行测试,请在记事本中调用test.vbs创建一个文件。在文件中键入以下内容:
Dim myObject
set myObject = CreateObject("ActiveXTest.MyObject")
MsgBox(myObject.HelloWorld)
打开命令提示符并导航到创建Test.vbs的位置,然后键入:wscript test.vbs。应显示一个对话框,说明“这是COM组件中的Hellow World”
要从IE测试,我创建了一个包含以下内容的TEST.HTML文件:
<HTML>
<HEAD>
<script language="JScript" language="JavaScript">
var obj = new ActiveXObject("ActiveXTest.MyObject");
alert(obj.HelloWorld());
</script>
</HEAD>
<body>
<span>nothing to see here!</span>
<body>
</HTML>
在IE中打开TEST.HTML文件。您将收到有关ActiveX控件的警告;只是说是,允许互动。您将收到一个警告对话框,指出“这是来自COM组件的Hello World”。
可以使用类似的步骤使其从.js文件或Excel VBA中运行。请注意,如果更改ActiveX程序集的COM方法签名,我相信您需要重新注册它。