如何解决.NET COM Callable Wrapper DLL的注册/使用情况?
题
我已经写了一个c#.NET COM可调用包装器DLL。我用一个strondName签名并使用64位Regasm.exe注册了CodeBase和Typelib。使用64位OLEViewer可见注册和所有控制的方法。但是,当我尝试使用64位\ Windows \ System32 \ cscript.exe:的控制
Set logger = CreateObject("MyCompany.LoggerControl")
.
这会产生错误:
microsoft vbscript运行时错误:ActiveX组件无法创建对象:'mycompany.loggercontrol'
使用来自sysutils的procmon来跟踪它,我发现:
1:41:44.8295486 cscript.exe 24028 regopenkey hkcr \ mycompany.loggerControl
名称未找到所需的访问:读取 但是,此密钥存在于Regedit中。调用进程从提升的命令提示符运行。如果是安全问题,不应该错误是“访问被拒绝”而不是“未找到的名称”?追踪此类COM控制注册错误的其他工具是什么?
解决方案
这里是几个故障排除的想法:
-
在尝试创建对象时识别正在返回的确切错误编号:
在错误恢复下一个 Set Logger= CreateObject(“MyCompany.LoggerControl”)
如果呃那么 wscript.echo“错误#”&err.number wscript.echo err.description. wscript.quit 1 如果 结束 -
查找此错误代码。例如,它是“被拒绝的访问”或其他一些错误?
-
创建一个c#可执行文件以调用您的对象,并查看它是否可以成功创建它。
-
确保您的DLL没有任何其他依赖关系,防止它在脚本运行的目录中加载。您可以从中从运行脚本的目录中使用Depends.exe或者您可以使用我最喜欢的穷人的Regsvr32的技术来尝试加载DLL。如果DLL由于依赖关系而无法加载,您将收到一个错误对话框,告诉您无法找到另一个DLL或加载其依赖项之一。如果它可以加载DLL确定它会说它成功注册。
c:\ pathtovbs> regsvr32 c:\ pathtoyourdll \ yourdll.dll