好的,虽然我从未想过在 2012 年我会编写我的第一个 ActiveX 控件(是的,这是有充分理由的),但我正在努力让它在 Windows 7 (x64) 下运行。
解决方案短篇小说: 我在一些 regasm 调用中丢失了 /codebase,并且还混合了 32 位和 64 位进程,但是标准 VS2010 命令提示符混合了 regasm 和 cscript 的 32 位和 64 位路径并没有帮助.
长篇大论如下:
我一直在
(糟糕 ,我的链接有误......虽然看起来我最初提供的链接是有人复制了原始博客页面)
和
而且我似乎成功地构建了项目(对于后一个项目,我必须将资源编译器位置更改为正确的位置)。
对于第一个项目,我使用建议的安装程序,对于第二个项目,我尝试直接使用 regasm。
但在此之后,一切都在走下坡路。我尝试注册所有但要么:
- 我不知道应该如何注册它们,或者:
- 我不知道我应该如何注册它们。
我的测试用例是一个简单的 JScript 文件,其中包含
var x = new ActiveXObject( "name of object" );
失败并出现错误:
test.js(1,1) Microsoft JScript 运行时错误:自动化服务器无法创建对象
我不确定这是权限问题,还是 32 位与 64 位问题或两者兼而有之。
许多提供 ActiveX 帮助的网站都假设您将通过网页访问它,所以我尝试查看 IE 权限(即使我想将控件加载到第三部分程序中)。
我知道如果我使用 regasm 的 'framework' 或 'framework64' 版本,我可以控制注册表项的放置位置 - 我已经看到一些关于以 32 位或 64 位运行 cscript 的引用(这可能会影响搜索注册表)取决于调用的 cmd shell(我已经尝试了两种方法,以及尝试了“管理员”shell)。
所以基本上在这一点上我不知道我在做什么或我应该做什么。
我的目标是在 Windows 7 x64 上注册一个 ActiveX 控件并使其能够通过以下方式加载:
- 从默认 Windows 命令提示符运行的测试 .js 脚本
- 将相同的控件加载到 Excel 2007 VBA 之类的东西中(仅用于测试)
- 将控件加载到第 3 部分应用程序(Rockwell 的 RSView Studio)中,并将其托管在 VBA 应用程序中(我需要检查这个是 32 位还是 64 位程序......我怀疑是前者)
笔记
对于使用安装程序的项目(使用 C# 在 .Net 中创建 ActiveX 控件),它将代码安装到“c:\program Files (x86)\”并使用 regedit 查找我在“Computer\HKEY_CLASSES_ROOT\Wow6432Node\”下找到条目我相信 CLSID\" 告诉我 DLL 是作为 32 位进程安装的。我尝试从 32 位和 64 位 cmd 运行我的 cscript 测试,但它们都失败了。请注意,安装程序在运行时正在创建相当于“regasm /codebase”的内容。
对于我尝试使用 regasm 注册它的项目(C# ActiveX 控件(CSActiveX)),它有一些用于注册 ActiveX COM 控件的附加代码。此代码提到注册 32 位进程内服务器(请参阅 ActiveXCtrlHelpers.cs)
(顺便说一句,我现在也在 Safari/Lion 中诅咒自动更正,不断将小写“DLL”更改为“全部”)
编辑 2012-08-07
在 Art 的回答的提示下,我发现:
从标准 VS2010 命令提示符
当通过标准 VS2010 命令提示符运行“regasm /codebase”时(并且作为管理员允许 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 'which' 命令的 windows 等效项,以确保我使用的是哪个 regasm)'where' 命令
查看 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 将文件保存为 UTF-8 和 BOM)