在 Borland C++ 6 中从 Windows 获取程序文件目录
Posted
技术标签:
【中文标题】在 Borland C++ 6 中从 Windows 获取程序文件目录【英文标题】:Get program files directory from Windows in Borland C++ 6 【发布时间】: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 等)。 【参考方案1】:这首先是一个部署问题。您必须将程序复制/安装到 64 位计算机上的 c:\program files (x86)
。您可以在代码中简单地使用 c:\program 文件,Windows 会将其重定向到 (x86) 目录。
要绕过 UAC 没有简单的解决方法。您必须在可执行文件中嵌入清单以请求管理员权限。用户收到 UAC 提示,让她知道您将要破解私有部分。如何用这么旧的工具做到这一点对我来说并不明显,你可能必须将它嵌入到 .rc 文件中。或者使用 .manifest 文件。
【讨论】:
【参考方案2】:How to get Program Files folder path (not Program Files (x86)) from 32bit WOW process?
【讨论】:
我需要获取的通常是“程序文件 (X86)”。我不知道它在任何其他机器上是否有所不同。因此,为什么我想直接从 Windows 获取它。【参考方案3】:将SHGetFolderPath
与CSIDL_PROGRAM_FILES
一起使用。
如果您始终使用 Windows Vista 或更高版本,则有一个名为 SHGetKnownFolderPath
的更新版本,但您可能需要更新您的 Platform SDK。如果您仍在使用 Borland C++ 6,我怀疑您的 Platform SDK 可能较旧。在这种情况下,您应该可以使用SHGetFolderPath
。
【讨论】:
我已经尝试过 SHGetFolderPath,但是当我 #include Shlobj.h 时,它会严重崩溃。仅供参考,我在 XP 机器上编程,这可能是原因。可悲的是,没有办法不在 XP 上对其进行编程。软件问题。 我还在用XP,这个功能我用过很多次了。崩溃是由别的东西引起的。你可以试试SHGetSpecialFolderPath
(msdn.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) 管理员的问题,如果组策略编辑器未用于明确允许管理员使用它。这不是要求的。以上是关于在 Borland C++ 6 中从 Windows 获取程序文件目录的主要内容,如果未能解决你的问题,请参考以下文章
虚拟内存地址空间不足(Borland C++ Builder 6 程序)
Borland Builder C++ 6 中的 CoreAudio API
Borland C++ Builder 6 上的奇怪链接器错误
Borland c++ build 6编译出错Could not find a match for OpenArray<TVarRec>::OpenArray