我的問題是,目前,我的程序中的所有參考都使用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");
}