如何检测可执行文件中的Program Files文件夹?

时间:2011-02-16 06:11:40

标签: visual-c++ setup-project setup-deployment

我的问题是,目前我程序中的所有引用都使用C:\\Program Files\\Myprogram文件夹。有没有办法让我的程序可以在任何机器上安装,无论他们的Program Files文件夹位于何处。

这是因为有些机器,在其他驱动器上有文件夹,例如。 D:\Program Files,在Win7机器上有其Program Files文件夹的不同名称。

需要建议:)

4 个答案:

答案 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版本的使用年限,您可能还需要查看SHGetFolderPathSHGetSpecialFolderPath

答案 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");
}