3

我编写了一个 C# .NET Com 可调用包装 DLL。我使用 StrongName 对其进行了签名,并使用 64 位 regasm.exe 注册了代码库和类型库。使用 64 位 OleViewer 可以看到注册和所有控件的方法。但是,当我尝试使用来自 64 位 \Windows\System32\cscript.exe 的控件时:

  Set logger = CreateObject("MyCompany.LoggerControl")

这会产生错误:

Microsoft VBScript 运行时错误:ActiveX 组件无法创建对象:“MyCompany.LoggerControl”

使用来自 Sysutils 的 ProcMon 来追踪它,我发现:

1:41:44.8295486 PM cscript.exe 24028 RegOpenKey HKCR\MyCompany.LoggerControl
NAME NOT FOUND 所需访问权限:读取

但是,该键存在于 Regedit 中。调用进程从提升的命令提示符运行。如果这是一个安全问题,错误不应该是“拒绝访问”而不是“未找到名称”吗?

还有什么其他工具可以追踪这种类型的 COM 控件注册错误?

4

1 回答 1

1

以下是一些故障排除思路:

  1. 确定尝试创建对象时返回的确切错误号:

    On Error Resume Next
    Set logger = CreateObject("MyCompany.LoggerControl")
    If Err Then WScript.Echo "Error # " & Err.Number WScript.Echo Err.Description WScript.Quit 1 End If

  2. 查找此错误代码。例如,是“拒绝访问”还是其他错误?

  3. 创建一个 C# 可执行文件来调用您的对象并查看它是否可以成功创建它。

  4. 确保您的 DLL 没有任何其他依赖项阻止它被加载到您的脚本运行的目录中。您可以使用运行脚本的目录中的depends.exe,也可以使用我最喜欢的穷人技术regsvr32 来尝试加载DLL。如果 DLL 由于依赖项而无法加载,您将收到一个错误对话框,告诉您它找不到另一个 DLL 或加载其依赖项之一。如果它可以加载 DLL ok,它会说它成功注册了它。

    C:\PathToVbs>regsvr32 C:\PathToYourDLL\YourDLL.dll

于 2012-03-08T19:21:52.863 回答