Ссылочный INI-файл MFC C ++ в папке приложения после развертывания - PullRequest
1 голос
/ 08 июля 2011

Надеюсь на помощь здесь, так как я вырываю волосы! Я использую Visual Studio 2010.

У меня есть приложение MFC C ++ для развертывания. У меня есть файл config.ini, на который я бы хотел сослаться при запуске exe. В настоящее время пользователь не может дважды щелкнуть * .myfile, и он открывается, потому что приложение не «запускается» в папке приложения (куда я устанавливаю INI-файл), и поэтому не может найти INI. Я пробовал следующее

  • Я попытался найти информацию о настройке папки «start in» для действия & Open, но ничего не смог найти.

  • Я не могу найти какую-либо информацию о настройке значения реестра ini-файла при установке, поскольку это будет относительная ссылка в зависимости от выбора пользователя, поэтому this не применяются.

  • Он неуправляемый, поэтому решение app.config для C ++ / CLI не применяется.

  • Использование папки Application Data, но это дает мне неправильный путь - я использую Windows 7, возможно, поэтому, но я хочу, чтобы мое развертывание работало на Windows XP ++ .

  • Считывание пути приложения при запуске (с здесь ) (поместите это в CMyApp :: InitInstance ().

Код:

CString strPath;
TCHAR* pstrExePath = strPath.GetBuffer (MAX_PATH);
::GetModuleFileName (0, pstrExePath, MAX_PATH);
strPath.ReleaseBuffer();
int pos = strPath.ReverseFind('\\');
strPath = strPath.Left(pos);
strPath += "\\config.ini";

Это самый близкий, но в режиме отладки странный путь "\. \" Делает его недействительным. Я мог бы использовать #ifdebug, но это, конечно, грязно?

Очень ценю любую помощь - спасибо!


EDIT:

Используя это:

TCHAR szPath[MAX_PATH];
if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath)))
{
    MessageBox(NULL,szPath, "MyApp", MB_OK|MB_ICONWARNING);
}

Я получаю: "C: \ ProgramData" в качестве szPath. Может быть, это правильно для режима отладки? Или машина для разработки?

1 Ответ

1 голос
/ 09 июля 2011

Спасибо за все комментарии и подсказки. Это помогло мне добраться до этого решения. Надеюсь, это поможет некоторым другим иметь информацию в одном месте. Это решение очень простое и, вероятно, не для полного коммерческого развертывания!

  • В VS2010 в Файловой Системе (Настройка) положить файл конфигурации в пользовательском Папка с данными приложения \ Productname
  • Установите для InstallAllUsers значение false, чтобы вам не нужны условия, где ваш конфигурационный файл находится на основе выбор установки пользователя
  • В функцию InitInstance () добавьте что-то вроде следующего:

[listbreaker]

TCHAR szPath[MAX_PATH] = {0};
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA|CSIDL_FLAG_CREATE,NULL,SHGFP_TYPE_CURRENT,szPath))) 
{
    PathAppend(szPath, "\\MyApp\\");
            // Can check to create the directory here
    //if (!PathFileExists(szPath))
    //  CreateDirectory(szPath, NULL);
    PathAppend(szPath, TEXT("MyApp.ini"));
            // can check to create default file here if removed by user
    //if (!PathFileExists(szPath))
        //g_ConfigData.write_default()  // be nice if it could write itself
    //MessageBox(NULL,szPath, "MyApp", MB_OK|MB_ICONWARNING);
}
if (!g_ConfigData.ReadData( szPath ) )
    MessageBox(NULL,"Configuration file cannot be read", "MyApp", MB_OK|MB_ICONWARNING);

Некоторые полезные ссылки, которые действительно помогли мне в этом:

Буду признателен за дальнейшую помощь в этом, поскольку я уверен, что есть более совершенные и гибкие решения (например, обработка выбора «Все пользователи» при установке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...