【问题标题】:COM function fails on VBscript but not VB6 on Win64COM 函数在 VBscript 上失败,但在 Win64 上没有 VB6
【发布时间】:2017-09-02 14:27:15
【问题描述】:

我在 c# .Net 4.5 中编写了一个 COM 控件,该 COM 控件使用第 3 方 dll 与 USB 设备进行通信。

在 32 位 Windows 7 上,VBScript 和 VB6 应用程序都能 100% 运行。在 Windows 7 64bit 上,调用使用 USB 设备的第 3 方 dll 函数时 VBScript 失败。

例外情况是:“System.AccessViolationException”,消息为:“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”

我不明白的是,相同的 COM 控件(和相同的 USB 驱动程序)在从 VB6 应用程序实例化时可以工作,而不是从 VBScript 实例化。

在运行 VB6 应用程序和 VBScript 时,我使用 Process Monitor 查看了加载的程序集和注册表访问,但我看不到任何异常。

关于我接下来可以排除故障或测试什么的任何建议?

【问题讨论】:

  • vb6 总是 32bit 我以为.. 结果在 64bit 上运行与否,它的 32bit。
  • 是的,除非 op 实际上是指 VBA。即使没有,我认为这个问题需要更多细节,至少显示已经尝试过的内容、提出问题的相关工作示例、错误代码等。
  • 尝试以"c:\windows\syswow64\cscript.exe" myScript.vbs运行它
  • @MCND 我已经使用 Syswow64 文件夹中的 cscript 和 wscript 进行了测试,两者都产生了相同的结果,事实上,如果不是这两个中的任何一个,脚本甚至都不会运行。
  • 在@MCND 建议之上,您是否以提升的权限运行它们?

标签: c# vbscript com


【解决方案1】:

这是交易。从 VB6 编写的应用程序是 32 位的。您的应用程序可以在 32 位 Windows 上运行,也可以从 VB6 应用程序在 Windows 64 上运行(它以 32 位运行,因为 VB6 生成 32 位。因此,我们知道您的 DLL 可以用于 32 位应用程序。

问题是,当您在 Windows 64 上运行 VB 脚本时,它作为 64 位进程运行,并且与您的 32 位 DLL 不匹配。如果您使用 32 位版本的 VB 脚本引擎(c:\windows\syswow64\wscript.exe 或 c:\windows\syswow64\cscript.exe)运行 VB 脚本,它可以工作吗?应该会的。

现在,如果您使用 AnyCPU 处理器设置编译 DLL,那么您仍然可以注册 DLL 并使其与 64 位进程一起使用。请务必使用 64 位配置单元中的 regasm.exe。

例如注册你的 DLL,

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /tlb /codebase c:\path\to\yourdll.dll

【讨论】:

  • 我制作了一个仅包含违规代码的控制台应用程序(使用来自第 3 方 dll 的 USB 设备)。这个控制台应用程序是为 x86 编译的,它仍然会引发异常。我尝试为 .Net 2.0 中的任何内容编译控制台应用程序,我得到了相同的结果。我感觉 VB6 加载了第 3 方 USB 驱动程序需要的一些程序集或模块,但是比较我的测试应用程序和 VB6 应用程序中加载的模块显示加载了相同的模块。
  • 您可以使用进程监视器 1) 在抛出异常之前查看正在尝试加载的文件或正在读取的注册表项 2) 查看 VB6 正在加载哪些模块或注册表项应用
  • 正如我的问题中提到的,这正是我将加载的模块从 VBScript 与 VB6 应用程序进行比较时所做的,它们都从相同的位置加载了相同的模块,并访问了相同的注册表项.
猜你喜欢
  • 2017-09-25
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
相关资源
最近更新 更多