0

我有一个使用表达式的旧版 VB6 系统

Write #1, (UnitCount

写一个文本文件。(UnitCount 是第一个写入的几个短整数。)

这在 XP 下运行良好,但在 Vista 和 Windows 8 下不生成文本文件。不报告错误。

有谁知道如何解决这一问题?

另外 - VB6 应用程序安装在 C:/Program Files/IronDuke

并且文本文件也打算写在这里(即在当前目录中)。

我知道右括号。我只包括了声明的一部分。

4

2 回答 2

5

该文件实际上已创建,您只是无法找到它。它存储在隔离存储中。

这是现代 Windows 版本中的一个 appcompat 功能,从 Vista 开始。不再允许程序写入c:\program files. 或者c:\program files (x86),您要在 64 位操作系统上写入的目录。UAC 保护这些目录免受恶意软件和善意但危险的程序的侵害,该程序必须通过显示 UAC 提示来获得提升的权限,以让用户知道它将进行可能影响其计算机的重大更改。

由于您的 VB6 EXE 文件在 Windows 中看起来像是一个不支持 UAC 的古老程序,这是一个非常准确的猜测,它会自动将文件重定向到独立存储以允许您的程序正确执行。您也可以轻松读取文件。但当然不是你真正想要完成的。

让您的程序显示 UAC 提升提示有点棘手,VB6 并非旨在将清单嵌入到 EXE 文件中。清单在 15 年前还不存在。您需要在 yourapp.exe 文件所在的目录中创建一个名为 yourapp.exe.manifest 的文件。使用可以编写 utf-8 编码文件(不是 VB6)的文本编辑器,使其看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

请注意,在 64 位操作系统上仍然存在严重问题,您最终将写入 c:\program 文件 (x86) 而不是 c:\program 文件。没有简单的解决方法。请考虑寻找更适合现代操作系统的现代工具,VB.NET 肯定会给您带来更少的麻烦。

于 2013-10-13T14:50:48.960 回答
0

您的应用程序被视为旧版(不支持 Vista),因此您写入受保护位置的文件正在被虚拟化(而不是“隔离”),而不是导致安全违规异常。文件系统 VirtualStore 存在于每个用户的配置文件路径中。

VB6 完全有可能嵌入应用程序清单,尽管它不会为您生成一个。您只需单独创建清单文件,然后将其作为自定义资源包含在 Type #24 和 Id #1 中,它将被直接编译。

一个警告是清单文件应该是 UTF-8 XML填充到 4 字节的偶数倍。如果需要填充,您可以在末尾添加空格。您可以从记事本中将其保存为 ANSI,因为通常只使用 7 位 ASCII 字符子集,这样可以避免出现 UTF-8 BOM 的风险,而您不希望记事本编写该文件。

甚至有一些简单的方法可以在需要时绕过 WOW64 重定向,尽管没有充分的理由这样做。

但是,如果程序确实将此文件写入其当前目录,您可能会发现修改开始菜单快捷方式或创建新快捷方式要容易得多。只需将快捷方式的当前目录(“开始于”)设置为一些合法的可写位置,例如您的 Documents 目录、D: 驱动器上的某个目录、Public 特殊文件夹等。

于 2013-10-15T07:17:15.453 回答