2011-02-16 78 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"); 
} 
相关问题