我的问题是,目前我程序中的所有引用都使用C:\\Program Files\\Myprogram
文件夹。有没有办法让我的程序可以在任何机器上安装,无论他们的Program Files
文件夹位于何处。
这是因为有些机器,在其他驱动器上有文件夹,例如。 D:\Program Files
,在Win7机器上有其Program Files文件夹的不同名称。
需要建议:)
答案 0 :(得分:1)
如果使用Visual C ++ .NET,则可以使用GetFolderPath
:
// Sample for the Environment::GetFolderPath method
#using <mscorlib.dll>
using namespace System;
int main() {
Console::WriteLine(S"GetFolderPath: {0}",
Environment::GetFolderPath(Environment::SpecialFolder::ProgramFiles));
return 0;
}
答案 1 :(得分:1)
微软对这个问题有大约六个不同的答案。我相信他们现在所青睐的是SHGetKnownFolderPath
。根据您关注的Windows版本的使用年限,您可能还需要查看SHGetFolderPath
或SHGetSpecialFolderPath
。
答案 2 :(得分:1)
是的,硬编码文件系统路径是非常不良做法,正是出于这个原因。它们可能会在不同的机器上发生变化,因此您的问题不应受到影响。
您需要使用environment variables代替。 “Program Files”文件夹的文件非常简单易记。它很简单:
%PROGRAMFILES%
Windows API还提供了一组函数来检索这些特殊文件夹的位置。调查SHGetFolderPath
function(或SHGetKnownFolderPath
,假设您只需要定位运行Windows Vista及更高版本的客户端)。您需要为Program Files文件夹CSIDL_PROGRAM_FILES
指定CSIDL值。完整列表可用here。
示例代码:
TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, szPath);
答案 3 :(得分:1)
如果您使用C / C ++编写程序,则可以使用http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx中指定的SHGetFolderPath函数。 Vista和更新版本都有更新的API,但这个API仍然是为了向后兼容。
从Visual Studio命令提示符,您可以构建并运行它来试用它。
// Build with:
// cl sample.cpp /link Shell32.lib
#include <stdio.h>
#include <Shlobj.h>
void main()
{
char path[MAX_PATH];
HRESULT hr = SHGetFolderPath(
0, // hwndOwner
CSIDL_PROGRAM_FILES, // nFolder
0, // hToken
SHGFP_TYPE_CURRENT, // dwFlags
path); // pszPath
if (hr == S_OK)
printf("Program files at\r\n%s", path);
else
printf("failed to get folder");
}