在Windows XP,Windows 7,Windows 8上安装VB6应用程序

时间:2013-03-20 16:15:45

标签: deployment vb6

我已经阅读了关于这个主题的无数帖子,但无法将我的大脑包裹在整个事物中。我有一个旧的VB6应用程序,用于安装在根目录下的文件夹中。在该文件夹中有子文件夹:
访问数据库的 \ data 子文件夹
\ quotes 子文件夹,其中存储用户生成的Word文档 \ backup 我的程序定期备份mdb的副本

效果很好,生活很简单。现在,当我们尝试在Windows 7和Windows 8上安装时,程序将安装到程序文件(x86)文件夹中。程序运行正常,但所有数据库更新和word文件都存储在users文件夹中的虚拟商店中,这不是我们想要的。

我知道为什么会这样,我知道我需要修改我的程序来容纳Windows 7/8。有人可以给我一个明确的解释/建议如何:

我知道“用户”下的appdata文件夹是存储数据库/ word文件/备份的推荐位置。但是,在我隐藏的系统上,我希望用户可以轻松访问它(不是隐藏的),所以我在想MyDocuments文件夹?

我已经阅读了这个帖子:Where should I store application specific settings?,它让我对如何在代码中找到文件/位置有所了解,虽然目前尚不清楚如何找到MyDocuments。 有人可以帮忙吗?

这是我变得更加困惑的地方。如果我想使用MyDocuments \ CompanyName甚至上面链接中提到的Appdata文件夹,如何告诉程序包/部署向导将mdb文件和上述文件夹安装到此特定文件夹中?我可以使用PDW中的Appdata或MyDocuments文件夹的宏吗?我在XP机器上,所以我的路径与Windows 7/8机器不同。

非常感谢任何帮助/见解。

2 个答案:

答案 0 :(得分:7)

  

我知道为什么会这样,我知道我需要修改我的程序以适应Windows 7/8。

好,然后我会尽量不打败死马(虽然这是我经常喜欢鞭打的人,因为很多人误解了它)。我只是指出,即使在较旧版本的Windows上,您的程序正常工作的事实也是潜在错误的幸运结果。 "程序文件"文件夹从来就不是可写的。你不只是在解决一些愚蠢的问题"较新版本的Windows。这应该是从一开始就应该做的事情。

  

我知道"用户"下的appdata文件夹是存储数据库/ word文件/备份的推荐位置。但是,在我隐藏的系统上,我希望用户可以轻松访问它(不是隐藏的),所以我在想MyDocuments文件夹?

我知道这很复杂,所以让我看看我是否可以尽量让它变得简单......

"应用数据" 文件夹用于供应用程序内部使用的数据,用于直接由用户查看或操作

"我的文档" 文件夹适用于用户应该能够看到和直接操作的所有内容;换句话说,用户数据而不是应用程序数据。

然后还有这两种文件夹类型中的每一种的每用户和全局变体。在" App Data"的情况下,每用户变体进一步细分为本地(仅停留在本地计算机上)和漫游(其跟随用户帐户到她所在的网络上的任何机器)登录)。

因此,如果您希望用户可以轻松访问这些文件,那么您一定要使用"我的文档"夹。这就是它的用户文档。

之所以存在所有这些复杂规则的原因是因为像微软和Adobe这样的流行供应商的行为不端的应用程序(有?)倾向于将垃圾转移到用户的“我的文档”中。文件夹,用户从未打算直接与之交互的内容。然后用户打开他们的文档文件夹,看到他们从未放在那里的一堆东西。 "这些东西是什么?这些不是我的。我的文件在哪里?" 上周我更新她的电脑时,我母亲就问过我。

  

它不清楚如何找到MyDocuments。有人可以帮忙吗?

从VB 6开始?简单的方法是BobMark在您查看的问题中建议的方式。这包括创建一个Shell对象并查询它对您感兴趣的文件夹的位置。

缺少的部分是对应于"我的文档"的常量。夹。您将找到常量here的完整列表。你想要的那个被命名为ssfPERSONAL(因为在过去创建这个API的过程中,Windows并不是友好的,并且"我的文档"名称还没有被发明但是),其值为&H05。所以代码看起来像:

Const ssfPERSONAL = &H05

Dim strMyDocsPath As String
strMyDocsPath = CreateObject("Shell.Application").NameSpace(ssfPERSONAL).Self.Path
  

如果我想使用MyDocuments \ CompanyName甚至上面链接中提到的Appdata文件夹,我如何告诉程序包/部署向导将mdb文件和上述文件夹安装到此特定文件夹中?我可以使用PDW中的Appdata或MyDocuments文件夹的宏吗?

除了建议在你对这个VB应用程序进行现代化改造时,我还没有多少可以添加到Bob his answer中。考虑放弃过时的PDW,转而选择更好的安装人员。

就个人而言,我是Inno Setup巨大粉丝,这是一款适用于Windows应用程序的免费安装程序实用程序,它提供的功能比您可以动摇的更多。它适用于VB 6应用程序。我自己多次使用过它。我认为它相当容易使用,至少对于基础知识来说。它支持各种高级自定义,如果你不通过阅读文档来学习,那么其中一些可能会很棘手,但这一切都非常可行。我甚至偶然发现了编写Delphi代码以定制Inno安装项目的方法!

在Inno Setup中,您可以使用pre-defined constants之一访问系统文件夹的路径。例如,{userdocs}{commondocs}。这些工作与PDW中的宏(如果不完全相同,已经很长时间)宏很相似。

当然,这仍然无法解决鲍勃正确指出的问题:用户的概念"我的文档"文件夹对安装程序没有多大意义。当然,您可以访问全球(公共)"我的文档"文件夹,因为它在所有用户之间共享,但这可能不是您想要的。安装程序应该能够由具有足够权限的任何用户运行,实际上这通常是与用于运行应用程序的常规用户帐户不同的管理员帐户。您无法在设置期间使用特定的用户帐户,并且您的设计必须考虑到这一点。

对我来说,一个"模板"方法对你来说是个好方法。用于设置新用户帐户的完整文件集可以存储在" Program Files"夹。这实际上是一个很好的地方,因为它可以很好地保护它免受错误的修改,而且由于你只是从读取,你可以保证拥有必要的权限。当应用程序首次在新用户帐户下启动时,它可以检测到这一事实并提供设置新用户帐户以供应用程序使用。此时,您知道自己在正确的用户帐户下运行,因此您可以使用上述代码查询该用户的位置"我的文档"夹。如果所需的文件夹结构都设置在应用程序文件夹的子目录中,那么设置新的用户帐户可能就像复制该文件夹一样简单。如果您需要从用户收集信息或提供自定义选项,您可以编写一些"首次运行向导"。

答案 1 :(得分:4)

  

我知道“用户”下的appdata文件夹是存储数据库/ word文件/备份的推荐位置。但是,在我隐藏的系统上,我希望用户可以轻松访问它(不是隐藏的),所以我在想MyDocuments文件夹?

这两个都是针对每用户数据的位置。因此,您的安装程序无法在此处放置任何内容,因为在正常情况下,它甚至不会在目标运行时用户下运行,也不会知道要为此数据定位哪一个。

相反,您需要确定哪些文件是每台计算机,哪些是每用户。应用程序在“首次运行”时应创建或复制任何每用户文件,通常应检查每用户应用程序文件夹中是否存在每用户INI文件(它还需要创建)在LocalAppData下。

每台机器文件进入ProgramData(CommonAppData)下的安装程序创建文件夹。在大多数情况下,您的安装程序不仅需要创建此“公司/应用程序”子文件夹,还需要设置文件夹的安全性,以允许用户拥有放置在那里的项目所需的访问权限。然后,安装程序可以将任何已部署的每台机器数据(如设置文件,MDB等)放入此文件夹中。

例外情况可能是您的首次操作复制到用户配置文件中的每台计算机“模板”文件,或者是应用程序生命周期内只读的其他数据。这些仍然可以转储到EXE旁边的Program Files子文件夹中(或者在子文件夹等中)。

PDW过于陈旧和原始,无法完成所需的所有安装活动。这并不意味着您无法破解setup1.vbp(通过安装VB6和PDW提供)来进行自定义setup1。但通常这不值得麻烦,因为你无法扩展PDW的“向导”以获得新的屏幕并接受新的信息。

随着Windows Installer于1998年问世,微软发布了一款名为Visual Studio 6.0 Installer 1.0的免费更新工具(一年后左右1.1),以补充/替换PDW。

Microsoft不再托管包含VSI 1.1的两个下载文件,尽管您仍然可以找到由第三方托管的副本(虽然病毒扫描也是如此)。

您还可以在更新版本的Visual Studio中使用安装程序项目类型(尽管我相信他们从VS 2012开始提取它)。还有WiX工具套件和基于第三方安装程序的工具。

但即使使用VSI 1.1,您也会发现在VSI 1.1中无法指定您需要的许多东西,这意味着您必须对MSI数据库进行一些后期构建调整。您可以使用安装程序SDK中的Orca或使用Windows Installer自动化界面的WSH脚本进行这些构建后编辑。

  

我已经读过这个帖子:我应该在哪里存储应用程序特定的设置?这让我对如何在代码中找到文件/位置有所了解,虽然目前尚不清楚如何找到MyDocuments。有人可以帮忙吗?

您可以通过自动化界面或API调用来使用Shell操作。此位置是通过ssfPERSONALCSIDL_PERSONALFOLDERID_Documents常量请求的,具体取决于您决定使用哪个来电来获取该位置。