如何将VB6应用程序从XP更新到Vista?

如何将VB6应用程序从XP更新到Vista?,vb6,windows-vista,uac,windows-appcompat-platform,Vb6,Windows Vista,Uac,Windows Appcompat Platform,我在一个vb6应用程序上工作,该应用程序在Vista上出现问题,原因很明显(写入程序文件,以及其他默认情况下不再允许的事情) 我应该在哪里存储应用程序数据或用户保存的文件 我是否也需要特权来创建文件夹和文件 还有哪些常见操作会导致问题 程序有一个必须下载和注册文件的更新程序,发生这种情况时我如何提升权限 其中一些问题有明显的答案,但我想把明显的东西弄对。在排序术语中,安装将有所帮助。长期而言,您需要将数据和配置信息放在\users或\programdata下的users目录中。短期内可能根本

我在一个vb6应用程序上工作,该应用程序在Vista上出现问题,原因很明显(写入程序文件,以及其他默认情况下不再允许的事情)

  • 我应该在哪里存储应用程序数据或用户保存的文件
  • 我是否也需要特权来创建文件夹和文件
  • 还有哪些常见操作会导致问题
  • 程序有一个必须下载和注册文件的更新程序,发生这种情况时我如何提升权限

其中一些问题有明显的答案,但我想把明显的东西弄对。

在排序术语中,安装将有所帮助。长期而言,您需要将数据和配置信息放在\users或\programdata下的users目录中。

短期内可能根本不需要修改应用程序,因为 Vista附带了一组兼容性选项,允许运行遗留应用程序。这包括文件和注册表虚拟化,这是一项功能,基本上将对受保护文件夹(如C:\Program Files)的写入操作重定向到一个虚拟位置,该虚拟位置仅对以兼容模式运行的特定应用程序可见


本文还提到了一些细节:在Dobb博士的文章中,

取决于你在做什么,你可能会陷入痛苦的世界。这些问题都没有硬性的答案,但我从一个正在经历同样问题的人那里知道

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) 我是否也需要特权来创建文件夹和文件

您需要管理员权限才能在程序文件中写入任何内容,如果可能,请不要这样做!我们目前认为,VB的API和标准API在程序文件中的文件上表现不同

3) 还有哪些常见操作会导致问题

有很多隐藏的陷阱。仅举几个例子,您无法通过IPC或命名管道与其他应用程序通信(我们有一个服务,我们通过托盘通知图标与之通信,必须完全重新编写)。任何你看到的UAC通知都是非常困难的。此外,如果没有管理员,您无法在本地\u计算机中写入注册表中的任何内容,因此您必须坚持使用本地\u用户或提高凭据(请参见下文)

4) 程序有一个必须下载和注册文件的更新程序,当这种情况发生时,我如何提升权限(sic)


祝您好运,我强烈建议您不要用VB6编写,就像我说的,VB6文件api访问文件的方式与标准api不同。如果您需要提升权限,请参阅有人善意地帮助过我的内容。

卡尔·彼得森(Karl Peterson)写了一篇关于在何处存储用户数据和应用程序数据的文章,用VB6为您检索特殊路径的位置。

我想您会惊讶于xp中对于非管理员用户的“默认允许”。在xp中以标准用户的身份运行它,它可能在xp中也不起作用。没错,但这从来都不是问题,因为没有人以标准用户的身份运行。不幸的是,程序经常假设用户是管理员,我很高兴微软最终在这个问题上采取了一致行动。听起来兼容性应该是自动的,但我们确实收到了关于兼容性问题的投诉。从程序文件中的文件读取程序设置似乎抛出了一个错误。这令人惊讶,因为读取文件应该总是可能的。您确定应用程序以只读模式打开了文件吗?应用程序打开文件的方式有点奇怪。应用程序功能分布在多个DLL上[使更新更小并封装一些内容]。由于文件编号不与DLL交叉,因此会打开一个DLL并读取文件。文件以“二进制”打开,即读/写。另一个注意:由于DLL具有不同的应用程序路径,因此我们始终使用完全限定的文件路径。根据其他答案中的一篇文章,“C:\program files\program\file.dat”而不是“file.dat”,您的虚拟文件夹位于C:\Virtual Store\SID\program files\…如果您用C编写程序并犯了相同的错误,“使用标准API”的程序将看到相同的行为。这不是VB6问题,而是未能声明程序Vista感知。这是关于文件系统虚拟化appcompat垫片应用于遗留程序的全部内容。早在Vista发布之前,就已经为开发人员记录了这一点。