由于显而易见的原因(写入程序文件以及默认情况下不再允许的其他内容),我正在处理一个与 Vista 存在问题的 vb6 应用程序。
- 我应该在哪里存储应用程序数据或用户保存的文件?
- 我也需要在那里创建文件夹和文件的权限吗?
- 还有哪些常见的操作会导致问题?
- 该程序有一个必须下载和注册文件的更新程序,发生这种情况时如何提升权限?
其中一些问题有明显的答案,但我想把明显的东西弄清楚。
由于显而易见的原因(写入程序文件以及默认情况下不再允许的其他内容),我正在处理一个与 Vista 存在问题的 vb6 应用程序。
其中一些问题有明显的答案,但我想把明显的东西弄清楚。
根据您所做的事情,您可能会陷入痛苦的世界。对于这些问题中的任何一个都没有硬性和快速的答案,但是我现在正在经历同样的问题,这就是我所知道的。
1) 我应该在哪里存储应用程序数据或用户保存的文件?
这取决于你想要做什么。如果您希望每个用户使用它们,请将它们存储在 Users/AppData 中,如果您希望它们用于所有用户,请将它们存储在 Common/AppData
If SHGetFolderPath(0, CSIDL_COMMON_APPDATA, -1, SHGFP_TYPE_CURRENT, sTempPath) = 0 Then
sCommonAppdata = Left$(sTempPath, InStr(1, sTempPath, Chr(0)) - 1) & "CompanyName\AppName"
End If
将其更改为用户 AppData 目录的 CSIDL_APPDATA。注意:对于 XP 和 Vista,这些映射到文件系统上完全不同的位置,因此在调试时准备查看不同的位置。
2) 我是否也需要权限来创建文件夹和文件?
您需要管理员权限才能在 Program Files 中写入任何内容,如果可能的话,不要这样做!我们目前遇到的问题是用于 VB 的 API 和标准 API 在 Program Files 中的文件上表现不同。
3) 还有哪些常见的操作会导致问题?
有很多隐藏的陷阱。仅举几例,您无法通过 IPC 或命名管道与其他应用程序进行通信(我们有一个通过托盘通知图标与之通信的服务,并且必须完全重写)。您看到 UAC 通知的任何事情都非常困难。此外,您不能在没有管理员的情况下在 LOCAL_MACHINE 的注册表中写入任何内容,因此您必须坚持使用 LOCAL_USER 或提高凭据(见下文)。
4) 该程序有一个必须下载和注册文件的更新程序,当发生这种情况时,我该如何提升权限(原文如此)?
祝你好运,我强烈建议你不要用 VB6 编写它,就像我说的那样,VB6 文件 api 访问文件的方式似乎与标准 API 不同。如果您需要提升权限,请参阅有人帮助我的这篇文章。
在排序术语中,关闭 UAC并安装ActiveX 安装程序服务器会有所帮助。从长远来看,您需要将数据和配置信息放在 \users 下的用户目录或 \programdata 中。
从短期来看,可能根本不需要修改您的应用程序,因为 Vista 提供了一组兼容性选项以允许运行旧版应用程序。这包括文件和注册表虚拟化,该功能基本上将写入操作重定向到受保护的文件夹,例如 C:\Program Files 到仅对在兼容模式下运行的特定应用程序可见的虚拟位置。
本文中提到了更多细节:Dobb 博士的如何管理 Windows Vista 应用程序兼容性。
Karl Peterson 写了一篇关于在哪里存储用户数据和应用程序数据的好文章,其中包含一个 VB6类,可以为您检索特殊路径的位置。