10

好的,虽然我从未想过在 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 运行时错误:自动化服务器无法创建对象

我不确定这是权限问题,还是 32 位与 64 位问题或两者兼而有之。

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

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

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

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

  1. 从默认 Windows 命令提示符运行的测试 .js 脚本
  2. 将相同的控件加载到 Excel 2007 VBA 之类的东西中(仅用于测试)
  3. 将控件加载到第 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)

4

1 回答 1

1

通过执行以下操作,我能够通过 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 文件:

    <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 方法签名,我相信您将需要重新注册它。

于 2012-08-07T01:55:52.220 回答