首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从vbscript - ActiveX错误调用ActiveX代码

无法从vbscript - ActiveX错误调用ActiveX代码
EN

Stack Overflow用户
提问于 2009-11-14 03:02:23
回答 5查看 4.9K关注 0票数 5

我正在尝试从VBScript调用我用VBScript编写的方法。

我已经遵循了所有的指示,我可以在网上找到,但仍然有问题。

特别是我得到了

错误: ActiveX组件无法创建对象 代码: 800A01AD

到目前为止,我所做的工作如下:

  1. 设置ComVisible(true)
  2. 使用regasm /codebase注册
  3. 坚强命名我的集会
  4. 确认它在注册表中并指向正确的位置。
  5. 使这个阶级公开
  6. 没有静态方法
  7. 使我想公开的方法
  8. 具有无参数构造函数
  9. 显式定义GUID

我的VBScript看起来是这样的:

代码语言:javascript
复制
set oObject = CreateObject("TTTTTT.FFFFF.CCCCCCCCC")

我的C#代码如下所示:

代码语言:javascript
复制
using System;
using System.IO;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace XXXXX.YYYYY
{
    [ComVisible(true)]
    [Guid("3EB62C37-79BC-44f7-AFBD-7B8113D1FD4F")]
    [ProgId("TTTTTT.FFFFF.CCCCCCCCC")]
    public class CCCCCCCCC
    {
        public void MyFunc()
        {
            //
        }
    }
}

有人能帮忙吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-11-14 13:35:00

下面是一个简单的项目,只有几个步骤,才能让您开始。

C#代码:

代码语言:javascript
复制
using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[assembly:System.CLSCompliant(true)]
[assembly: ComVisible(true)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b0")]

namespace Cheeso.ComTests
{
    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b1")]
    public class TestReply
    {
        public string salutation;
        public string name;
        public string time;
    }

    [Guid("7d9c5cd3-73d4-4ab1-ba98-32515256c0b2")]
    public class TestObj
    {
        // ctor
        public TestObj () {}

        public TestReply SayHello(string addressee)
        {
            return SayHello(addressee, "hello");
        }

        public TestReply SayHello(string addressee, string greeting)
        {
            string x = String.Format("{0}, {1}!", greeting, addressee);
            Console.WriteLine("{0}", x);

            TestReply r = new TestReply
            {
                salutation = greeting,
                name = addressee,
                time = System.DateTime.Now.ToString("u")
            };
            return r;
        }
    }
}

VBScript客户端代码:

代码语言:javascript
复制
Function Main()
    Dim obj
    Dim reply
    set obj = CreateObject("Cheeso.ComTests.TestObj")
    Set reply = obj.SayHello("Evgeny")
    WScript.Echo "Reply at: " & reply.time
    Set reply = obj.SayHello_2("Evgeny", "wassup")
    WScript.Echo "Reply at: " & reply.time
End Function

Main

建造:

代码语言:javascript
复制
(produce your .snk file, once)
csc.exe /t:library /debug+ /keyfile:Foo.snk /out:TestObj.dll TestObj.cs
regasm /codebase TestObj.exe

然后运行vbscript (通过cscript.exe)。

一旦基本操作成功,您就可以调整它,添加GAC,使类型显式化,添加显式ProgId等等。

ps: FYI,这个示例显示了在为interop注册的类上重载的.NET方法发生了什么。方法名称后面有一个隐式_2 (_3、_4等)。

票数 2
EN

Stack Overflow用户

发布于 2009-11-14 03:59:56

你读过这篇文章吗:COM互操作曝光

在本文的最后一页 (3)中,有一个列表:

  1. 为要向COM公开的方法定义一个.NET接口。
  2. 使用" GUID“属性为该接口分配一个Guid。
  3. 让您的类实现您的接口作为第一个接口。
  4. 使用" GUID“属性为该类分配一个Guid。
  5. 添加"ClassInterface(ClassInterfaceType.None)“属性,以防止regasm/tlbexp创建空的默认接口。
  6. 硬编码AssemblyVersion属性中的特定版本号。
  7. 为程序集创建一个强名称密钥对,并通过AssemblyKeyFile属性指向它。
  8. 将您的程序集添加到GAC,
  9. 使用REGASM命令和"/tlb“选项为COM注册程序集以生成COM类型库。

我不确定GAC和ClassInterfaceType.None是否是你拼图中缺失的部分,你可能想试一试。祝好运!

票数 4
EN

Stack Overflow用户

发布于 2009-11-14 18:19:13

您的代码并没有什么问题,您按照正确的安装过程进行安装。但是,您得到的错误代码清楚地表明脚本解释器在查找或加载程序集时遇到了问题。解决此问题的最佳方法是使用SysInternals的ProcMon实用程序。

我毫不费力地运行了您的代码,这些是ProcMon日志中最相关的条目:

代码语言:javascript
复制
22  12:04:41.1795038 PM WScript.exe 55280   RegOpenKey  HKCR\TTTTTT.FFFFF.CCCCCCCCC SUCCESS Desired Access: Read
26  12:04:41.1795682 PM WScript.exe 55280   RegOpenKey  HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID   SUCCESS Desired Access: Read
29  12:04:41.1796996 PM WScript.exe 55280   RegQueryValue   HKCR\TTTTTT.FFFFF.CCCCCCCCC\CLSID\(Default) SUCCESS Type: REG_SZ, Length: 78, Data: {3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}
34  12:04:41.1797653 PM WScript.exe 55280   RegOpenKey  HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}   SUCCESS Desired Access: Read
62  12:04:41.1802539 PM WScript.exe 55280   RegOpenKey  HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32    SUCCESS Desired Access: Read
71  12:04:41.1804181 PM WScript.exe 55280   RegQueryValue   HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\(Default)  SUCCESS Type: REG_SZ, Length: 24, Data: mscoree.dll
824 12:04:41.2425662 PM WScript.exe 55280   RegQueryValue   HKCR\CLSID\{3EB62C37-79BC-44F7-AFBD-7B8113D1FD4F}\InprocServer32\1.0.0.0\CodeBase   SUCCESS Type: REG_SZ, Length: 124, Data: file:///c:/projects/ClassLibrary2/obj/Debug/ClassLibrary2.DLL
... Lots of .NET keys...
1239    12:04:41.2970169 PM WScript.exe 55280   CreateFile  C:\projects\ClassLibrary2\obj\Debug\ClassLibrary2.dll   SUCCESS Desired Access: Read Attributes, Disposition: Open, Options: Open Reparse Point, Attributes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1733087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档