【问题标题】:Get program files directory from Windows in Borland C++ 6在 Borland C++ 6 中从 Windows 获取程序文件目录
【发布时间】:2011-03-28 15:37:49
【问题描述】:

我必须创建一个可执行文件(使用 Borland C++ Builder 6)来代替 Windows 7 的批处理文件,因为权限不允许普通用户(非管理员)运行必要的批处理。我们有许多不同的 Windows 7 机器,一些 64 位和一些 32 等。我遇到的问题是“程序文件”目录被硬编码到程序中,但它并不总是正确的程序文件目录,这会导致某些机器上的一些错误。

我很熟悉从注册表获取程序文件目录的方法,但恐怕这不适用于所有机器,因为权限设置不允许程序访问注册表。我一直在寻找像 GetWindowsDirectory 这样的功能,但无济于事。有没有人有什么建议?

编辑: 我已经在 Windows XP 机器上对此进行了编程,以便简单地放置在 Win7 上(无法更改或避免 XP/7 的事情,可能很糟糕)。这是一个无需安装的简单实用程序;它只是放在一个文件中。它只需要出去找到程序文件目录来执行一些任务。

【问题讨论】:

  • 这已经是asked
  • 不要在注册表中浏览此类内容。如果它没有记录在案,那么它可能会在未来中断。注册表中的许多路径用于向后兼容未找到正确 API 的应用程序(SHGetSpecialFolderPath、SHGetFolderPath、SHGetKnownFolderPath 等)。

标签: c++ c++builder c++builder-6 borland-c++


【解决方案1】:

这首先是一个部署问题。您必须将程序复制/安装到 64 位计算机上的 c:\program files (x86)。您可以在代码中简单地使用 c:\program 文件,Windows 会将其重定向到 (x86) 目录。

要绕过 UAC 没有简单的解决方法。您必须在可执行文件中嵌入清单以请求管理员权限。用户收到 UAC 提示,让她知道您将要破解私有部分。如何用这么旧的工具做到这一点对我来说并不明显,你可能必须将它嵌入到 .rc 文件中。或者使用 .manifest 文件。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 我需要获取的通常是“程序文件 (X86)”。我不知道它在任何其他机器上是否有所不同。因此,为什么我想直接从 Windows 获取它。
    【解决方案3】:

    SHGetFolderPathCSIDL_PROGRAM_FILES 一起使用。

    如果您始终使用 Windows Vista 或更高版本,则有一个名为 SHGetKnownFolderPath 的更新版本,但您可能需要更新您的 Platform SDK。如果您仍在使用 Borland C++ 6,我怀疑您的 Platform SDK 可能较旧。在这种情况下,您应该可以使用SHGetFolderPath

    【讨论】:

    • 我已经尝试过 SHGetFolderPath,但是当我 #include Shlobj.h 时,它会严重崩溃。仅供参考,我在 XP 机器上编程,这可能是原因。可悲的是,没有办法不在 XP 上对其进行编程。软件问题。
    • 我还在用XP,这个功能我用过很多次了。崩溃是由别的东西引起的。你可以试试SHGetSpecialFolderPathmsdn.microsoft.com/en-us/library/bb762204%28v=vs.85%29.aspx),调用起来更简单一些。
    • 你使用的是 Borland 还是 Visual?
    【解决方案4】:

    安装软件后,转到:

    C:\Program Files\Borland\CBuilder6\Bin
    

    右击bcb.exe文件,选择

    属性 -> 兼容性

    选择选项 - Run this program mode Windows XP(Service Pack 3)Privilege Level

    然后,选择选项Run as administrator,然后单击应用。

    这适用于我的问题。

    【讨论】:

    • 那只是一直以管理员模式运行程序。
    【解决方案5】:

    在 Windows 7 x64 上,只需在“c:\Program Files”中创建一个连接点,指向安装在“c:\Program Files(x86)”中的实际文件夹。这应该由安装软件的同一用户完成。这不仅可以解决您的问题,还可以解决无法在 Win 7 x64 上运行的第三方软件包。

    如果您不知道什么是连接点,请阅读 mklink 的帮助。

    【讨论】:

    • mklink 存在被禁止 a) 普通用户和 b) 管理员的问题,如果组策略编辑器未用于明确允许管理员使用它。这不是要求的。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2015-01-23
    • 2015-11-28
    • 2011-08-08
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多