ActiveX DLL错误

好的,虽然我从未想过在2012年我会编写我的第一个ActiveX控件(是的,这是有充分理由的)我正在努力让它在Windows 7(x64)下运行。

解决方案简短的故事:我从一些我的regasm调用中丢失了/ codebase,并且混合了32位和64位进程,但标准的VS2010命令提示符混合使用regasm和cscript的32位和64位路径没有帮助。

长篇故事如下:

我一直在弹跳

使用C#在.Net中创建ActiveX控件

哎呀我有错误的链接..虽然看起来我最初提供的链接是有人复制原始博客页面)

使用C#在.Net中创建ActiveX控件

C#ActiveX控件(CSActiveX)

我似乎正在成功构建项目(对于后者,我必须将资源编译器位置更改为正确的位置)。

对于我使用建议的安装程序的第一个项目,对于第二个项目,我试图直接使用regasm。

但在此之后,一切都在下山。 我尝试注册所有的,但要么:

  1. 我不知道我应该如何注册它们,或者:
  2. 我不知道我应该如何注册它们。

我的测试用例是一个包含的简单JScript文件

var x = new ActiveXObject( "name of object" ); 

哪个失败了,错误:

test.js(1,1)Microsoft JScript运行时错误:Automation Server无法创建对象

我不确定这是一个权限问题,还是32对64位问题或组合。

许多提供ActiveX帮助的网站假设您将通过网页访问它,所以我尝试查看IE权限(即使我想将控件加载到第三方程序中)。

我知道如果我使用’framework’或’framework64’版本的regasm我可以控制注册表项中的位置 – 我已经看到一些引用运行cscript作为32位或64位(这可能会影响到搜索注册表)取决于调用的cmd shell(我尝试了两种方式,以及尝试“管理员”shell)。

所以基本上在这一点上我不知道我在做什么或者我应该做什么。

我的目标是在Windows 7 x64上注册ActiveX控件,并使其能够通过以下方式加载:

  1. 从默认Windows命令提示符运行的测试.js脚本
  2. 将相同的控件加载到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

艺术家的回答提示我发现:

从标准的VS2010命令提示符

通过标准VS2010命令提示符运行’regasm / codebase’时(以及管理员允许regasm执行更改),条目被转储到HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID下的注册表中,并且测试脚本在同一提示符下失败。

但是我可以在Excel 2007中看到ActiveX控件(32位)

从x64 Win64 VS2010命令提示符

当在VS2010 x64 Win64命令提示符下运行时(再次作为管理员),注册表项出现在HKEY_CLASSES_ROOT \ CLSID下,但这次测试脚本在同一提示下运行,也来自标准Windows cmd提示符(但是它们在32位提示符下失败) )

但!! 我无法从Excel 2007(32位)看到活动的X控件

现在我只需要弄清楚* nix’哪个’命令的窗口相当于确保我使用哪个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将文件保存为带BOM的UTF-8)

通过执行以下操作,我能够通过IE和vbscript完成这项工作:

  1. 创建名为“ActiveXTest”的.NET类库
  2. 添加一个名为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!"; } } } 
  3. 编译课程。 转到编译该类的文件夹,并从Visual Studio命令提示符处执行以下操作:regasm / codebase ActiveXTest.dll

  4. 要从.vbs脚本进行测试,请在记事本中调用test.vbs创建一个文件。 在文件中键入以下内容:

     Dim myObject set myObject = CreateObject("ActiveXTest.MyObject") MsgBox(myObject.HelloWorld) 

打开命令提示符并导航到创建Test.vbs的位置,然后键入:wscript test.vbs。 应显示一个对话框,说明“这是来自COM组件的Hellow World”

  1. 为了从IE测试这个,我创建了一个包含以下内容的TEST.HTML文件:

          nothing to see here!   

在IE中打开TEST.HTML文件。 您将收到有关ActiveX控件的警告; 只是说是,允许互动。 您将看到一个警告对话框,指出“这是来自COM组件的Hello World”。

可以使用类似的步骤使其从.js文件或Excel VBA中运行。 请注意,如果更改ActiveX程序集的COM方法签名,我相信您需要重新注册它。