Как определить папку Program Files внутри моего исполняемого файла? - PullRequest
1 голос
/ 16 февраля 2011

Моя проблема в настоящее время, все ссылки внутри моей программы используют папку C:\\Program Files\\Myprogram. Можно ли сделать так, чтобы мою программу можно было установить на любой машине, независимо от того, где находится их папка Program Files.

Это потому, что на каком-то компьютере папка находится на другом диске, например. D:\Program Files, на машине Win7 другое имя для папки Program Files.

Нужен совет:)

Ответы [ 4 ]

1 голос
/ 16 февраля 2011

Если вы пишете свою программу на 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");
}
1 голос
/ 16 февраля 2011

У Microsoft около полутора десятков разных ответов на этот вопрос.Я считаю, что в данный момент они предпочитают SHGetKnownFolderPath.В зависимости от того, сколько лет версий Windows вам небезразличны, вы также можете посмотреть SHGetFolderPath или SHGetSpecialFolderPath.

1 голос
/ 16 февраля 2011

Да, жесткое кодирование путей в файловой системе является очень плохой практикой, именно по этой причине.Они могут быть изменены на разных машинах, и ваша проблема не должна быть затронута из-за этого.

Вместо этого вам нужно использовать переменные среды Папка для «Program Files» довольно проста и легко запоминается.Это просто:

%PROGRAMFILES%

API Windows также предоставляет набор функций для извлечения местоположений этих специальных папок.Изучите функцию SHGetFolderPath (или SHGetKnownFolderPath, предполагая, что вам нужно ориентироваться только на клиенты с Windows Vista и выше).Вам нужно будет указать значение CSIDL для папки Program Files CSIDL_PROGRAM_FILES.Полный список доступен здесь .

Пример кода:

TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, 0, szPath);
1 голос
/ 16 февраля 2011

Если вы используете 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...