我的问题是,目前,我的程序中的所有参考都使用C:\\Program Files\\Myprogram
文件夹。有没有办法让我的程序可以在任何机器上安装,无论它们的文件夹位于何处Program Files
。如何检测我的可执行文件中的Program Files文件夹?
这是因为有些机器,在其他驱动器例如文件夹。 D:\Program Files
,在Win7机器上的Program Files文件夹名称不同。
需要咨询:)
我的问题是,目前,我的程序中的所有参考都使用C:\\Program Files\\Myprogram
文件夹。有没有办法让我的程序可以在任何机器上安装,无论它们的文件夹位于何处Program Files
。如何检测我的可执行文件中的Program Files文件夹?
这是因为有些机器,在其他驱动器例如文件夹。 D:\Program Files
,在Win7机器上的Program Files文件夹名称不同。
需要咨询:)
是的,硬编码文件系统路径是一个不好的做法,正是出于这个原因。它们可能会在不同的机器上发生变化,因此您的问题不应受到一点影响。
您需要改为使用environment variables。 “Program Files”文件夹的内容非常简单并且易于记忆。它很简单:
%PROGRAMFILES%
Windows API提供了一组函数来检索这些特殊文件夹的位置。调查SHGetFolderPath
function(或SHGetKnownFolderPath
,假设您只需要运行Windows Vista及更高版本的客户端)。您需要指定Program Files文件夹的CSIDL值,CSIDL_PROGRAM_FILES
。完整列表可用here。
示例代码:
TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, szPath);
如果使用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;
}
微软有大约半打不同的回答这个问题。我相信他们目前赞成的是SHGetKnownFolderPath
。根据您关心的Windows版本的年龄,您可能还需要查看SHGetFolderPath
或SHGetSpecialFolderPath
。
如果你在C/C++编写程序时,您可以使用SHGetFolderPath函数作为http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx规定。 Vista和更新版本有更新的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");
}