ActiveX DLL错误

Pet*_*r M 10 c# dll activex visual-studio-2010

好吧,虽然我从未想过在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" );
Run Code Online (Sandbox Code Playgroud)

哪个失败了,错误:

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(32位)中看到ActiveX控件

从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
Run Code Online (Sandbox Code Playgroud)

这一切都开始使我的一些困惑可以理解.我一直在不知不觉地混合和匹配32位和64位系统,但VS2010标准提示也没有帮助!

(以及我的最新情况 - VS2010将文件保存为带BOM的UTF-8)

cod*_*urn 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!";
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编译类。转到编译类的文件夹,然后从 Visual Studio 命令提示符执行以下操作: regasm /codebase ActiveXTest.dll

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

    Dim myObject
    set myObject = CreateObject("ActiveXTest.MyObject")
    MsgBox(myObject.HelloWorld)
    
    Run Code Online (Sandbox Code Playgroud)

打开命令提示符并导航到创建 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>
    
    Run Code Online (Sandbox Code Playgroud)

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

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