Vb6 使用windows脚本运行时,特别是其中的FileSystemObject是一个好主意吗?
最近我被要求对VB6应用程序进行一些维护。这涉及到一些文件IO。我发现通过引用windows脚本主机和使用FileSystemObject提供的IO操作比VB6附带的IO操作要友好得多 但是,这会因为安全问题,或者因为脚本主机将在某些用户的计算机上被禁用而导致问题吗Vb6 使用windows脚本运行时,特别是其中的FileSystemObject是一个好主意吗?,vb6,filesystemobject,wsh,Vb6,Filesystemobject,Wsh,最近我被要求对VB6应用程序进行一些维护。这涉及到一些文件IO。我发现通过引用windows脚本主机和使用FileSystemObject提供的IO操作比VB6附带的IO操作要友好得多 但是,这会因为安全问题,或者因为脚本主机将在某些用户的计算机上被禁用而导致问题吗 更新(2012年8月20日):自提出此问题以来,我们在3000名客户中三次遇到了无法正常工作的scrrun.dll问题。我们必须通过远程支持手动修复这些问题。似乎有时要归咎于病毒扫描商。正如罗伯特·哈维(Robert Harvey)
更新(2012年8月20日):自提出此问题以来,我们在3000名客户中三次遇到了无法正常工作的scrrun.dll问题。我们必须通过远程支持手动修复这些问题。似乎有时要归咎于病毒扫描商。正如罗伯特·哈维(Robert Harvey)在评论中提到的,这在实践中通常不是问题。但是,
scrrun.dll
可能未安装或未在给定计算机上正确注册。在客户的机器上安装我们自己的VB6应用程序时,我们遇到了这两种情况
至于禁用脚本,我们实际上在其他应用程序(如Microsoft InfoPath)中遇到了这个问题,并通过将InfoPath表单(需要执行一些文件I/O)调出到使用WSHFileSystemObject
的VB6 DLL来解决这个问题,因此,通过将该库与VB6结合使用,实际上可以解决脚本安全问题。据我所知,WSH安全设置专门应用于实际脚本,而不是恰好使用脚本运行时组件的程序
事实上,您可以并且仍然可以从VB6应用程序访问WSH组件,例如
FileSystemObject
。VB中的文件IO总是有一些语法上的“奇怪之处”,这是因为它继承了Q/BASIC,但是如果您坚持直接读/写(避免行输入/写/获取),它的使用非常简单。
使用本机方法将比FSO更快,并避免任何依赖性问题,无论这些问题多么罕见
另一个需要考虑的问题是,如果要执行二进制文件IO,无论如何都必须使用本机方法,因为FSO是纯文本的。我偶尔遇到客户机器,
FileSystemObject
无法工作,可能是因为偏执的IT部门以某种方式禁用了它。如果可能的话,我现在尝试避免使用FileSystemObject
通常,您可以使用直接指向Windows API的本机VB6代码或API调用替换FileSystemObject
。例如,Karl E Peterson的《卓越》中有一些完全用VB6编写的伟大对象
一些例子
- 将整个文本文件转换为字符串李>
- 目录是否存在李>
- 文件是否存在李>
- 用于通过子目录递归的文件李>
- 仅驱动器和目录的文件路径李>
FileSystemObject
无法工作的客户机器,可能是因为偏执狂departments@MarkJ:正如我在回答中提到的,禁用WSH不会阻止您在VB6应用程序中使用FileSystemObject
,因为这些设置只影响您是否可以运行脚本。有趣的是,Microsoft()的这篇文章似乎指出,禁用对FileSystemObject
访问的具体方法是在计算机上注销scrrun.dll
。似乎没有专门的设置或权限来打开或关闭它。对于我们自己的应用程序,FileSystemObject
或Dictionary
类的某些组件依赖于scrrun.dll
,并且由于我们正试图逐步淘汰基于VB6的产品,我怀疑我们是否会重构它们以使用本机方法。如果scrrun.dll
未注册,我们只需重新注册,如果有人要求,我们会解释我们的应用程序需要它。到目前为止,我们遇到的IT部门还没有多疑到告诉我们不;-)您是正确的,如果您选择禁用WSH,并且按照Microsoft认可的方式执行,则不会影响FileSystemObject
。我们遇到了一些IT部门的客户,他们喜欢走得更远。这是罕见的,但它们是一个痛苦的解决办法。我们在全球范围内分发了数千份安装盘,很难让it部门与我们联系,更不用说注册DLL了。