2011-02-16 74 views
1

我的問題是,目前,我的程序中的所有參考都使用C:\\Program Files\\Myprogram文件夾。有沒有辦法讓我的程序可以在任何機器上安裝,無論它們的文件夾位於何處Program Files如何檢測我的可執行文件中的Program Files文件夾?

這是因爲有些機器,在其他驅動器例如文件夾。 D:\Program Files,在Win7機器上的Program Files文件夾名稱不同。

需要諮詢:)

回答

1

是的,硬編碼文件系統路徑是一個不好的做法,正是出於這個原因。它們可能會在不同的機器上發生變化,因此您的問題不應受到一點影響。

您需要改爲使用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); 
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

如果你在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"); 
} 
相關問題