如何解决.NET COM Callable Wrapper DLL的注册和使用问题?

3

我写了一个C# .NET Com可调用包装器DLL。我使用StrongName签名,并使用64位的regasm.exe注册了代码库和类型库。在64位OleViewer中,注册和所有控件方法都是可见的。但是,当我尝试从64位\Windows\System32\cscript.exe使用该控件时:

  Set logger = CreateObject("MyCompany.LoggerControl")

这会产生以下错误:

Microsoft VBScript runtime error: ActiveX component can't create object: 'MyCompany.LoggerControl'

使用 Sysutils 中的 ProcMon 对其进行跟踪,我发现:

1:41:44.8295486 PM cscript.exe 24028 RegOpenKey HKCR\MyCompany.LoggerControl
NAME NOT FOUND Desired Access: Read

然而,在 Regedit 中,该键存在。调用进程正在从提升的命令提示符中运行。如果这是个安全问题,那么错误应该是“ACCESS DENIED”,而不是“NAME NOT FOUND”吧?

还有哪些工具可以用来跟踪此类 COM 控件注册错误呢?


1
是否存在“HKCR\MyCompany.LoggerControl”并且可以访问它?请确保从相同位数的regedit查看,并仔细检查执行程序的位数,以确保没有发生任何奇怪的事情。(任务管理器中的“*”后缀= 32位。) - user166390
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,则会显示成功注册。

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


更新 - 我找到了问题所在 - 尽管进行了双重和三重检查,但我拼错了公司名称,因此原始的ProcMon跟踪是正确的 - 没有找到这个名称。 - Mike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接