VB6 COM对象 - 仅在IDE运行时有效?

时间:2011-01-20 18:29:09

标签: dll com vbscript activex

我在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时,我收到错误:

alt text

(出于安全原因删除了ProgID,但它与脚本中的相同。)

我尝试过的事情:

  1. 我怀疑在启动和停止调试器时,VB可能已经注册并注销了DLL,因此我还尝试在运行测试脚本之前使用regsvr32注册对象。这没有任何效果。

  2. 我还从注册表中删除了对DLL的所有引用,并重新注册了该对象。同样的错误。

  3. 我删除了DLL并从VB(File | Make ...)重新构建它并重新注册了DLL。同样的错误。

  4. 机器是Win7 Ultimate x64,用VB6构建的对象。

    有什么建议吗?

    并且,不幸的是,不能在C#中重写对象不是一种选择。

3 个答案:

答案 0 :(得分:1)

微软称这是一种依赖性问题:http://support.microsoft.com/kb/194801

因为它在IDE中运行对象时有效,所以有四种可能性:

  1. ActiveX dll本身不在系统路径上。
  2. ActiveX dll取决于系统路径上没有的其他内容。
  3. 注册dll之后,它以某种方式被标记为需要提升安全性才能运行
  4. 注册dll之后,它依赖的东西需要提高安全性才能运行。
  5. 我会尝试以管理员身份打开命令提示符,然后运行启动该对象的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