我在VB6中有一个古老的COM对象,直到最近一直运行良好。 (不是全部)。唯一的代码更改(由svn验证)是在数组中包含新的字符串文字。
VB6 IDE可以很好地编译对象。当我点击Run | Start ...并从命令提示符执行以下测试vb脚本时,该对象正常工作,我看到了我期望的对话框:
dim o
set o = CreateObject("MyDll.MyClassName")
wscript.Echo "Testing object"
wscript.Echo o.HelloWorld ' runs a test method that returns "Hello World"
wscript.Echo "Done"
但是,当我在IDE中停止调试并尝试从同一命令提示符运行相同的vbscript时,我收到错误:
(出于安全原因删除了ProgID,但它与脚本中的相同。)
我尝试过的事情:
我怀疑在启动和停止调试器时,VB可能已经注册并注销了DLL,因此我还尝试在运行测试脚本之前使用regsvr32
注册对象。这没有任何效果。
我还从注册表中删除了对DLL的所有引用,并重新注册了该对象。同样的错误。
我删除了DLL并从VB(File | Make ...)重新构建它并重新注册了DLL。同样的错误。
机器是Win7 Ultimate x64,用VB6构建的对象。
有什么建议吗?
并且,不幸的是,不能在C#中重写对象不是一种选择。
答案 0 :(得分:1)
微软称这是一种依赖性问题:http://support.microsoft.com/kb/194801
因为它在IDE中运行对象时有效,所以有四种可能性:
我会尝试以管理员身份打开命令提示符,然后运行启动该对象的vbscript文件。如果这样可行则意味着问题是#3或#4。如果没有,则表示#1或#2。
如果ActiveX dll没有外部依赖关系,则可以消除#2和#4。
接下来,我会查看我的事件日志,看看Windows是否记录了任何其他错误。
更新
刚刚找到另一个可能的原因。如果ActiveX dll是32位,那么脚本必须使用32位版本的脚本引擎来运行;否则它会给出这个错误,因为默认的脚本引擎(该机器上的x64)字面上找不到dll。
我相信如果你使用\ windows \ system32 \ cscript.exe来运行你的vbscript那么你会很好。
答案 1 :(得分:1)
嗯,这听起来肯定是因为32位dll的问题..上面提到的建议是正确的但是路径错了..尝试使用C:\ Windows \ SysWOW64中的CSCRIPT ..
答案 2 :(得分:0)
尝试从regsvr32.exe
向%Windows%\SysWOW64
注册DLL。 与regsvr32.exe
中的%Windows%\System32
(在64位操作系统上)不同。
请参阅此SO posting。