MFC C ++部署后在应用程序文件夹中引用INI文件

时间:2011-07-08 16:48:39

标签: c++ visual-studio-2010 deployment mfc

希望在这里得到一些帮助,因为我正在撕扯我的头发!我正在使用Visual Studio 2010。

我有一个要部署的MFC C ++应用程序。我有一个config.ini文件,我喜欢在exe启动时引用它。目前,用户无法双击* .myfile并打开它,因为应用程序没有“启动”应用程序文件夹(我将安装ini文件的位置),因此无法找到ini。我试过以下

  • 我尝试查找有关为& Open操作设置“start in”文件夹的信息,但找不到任何内容。

  • 我在安装时找不到有关设置ini文件注册表值的任何信息,因为根据用户的选择,这将是一个相对引用,因此this不适用。

  • 它是不受管理的,因此C ++ / CLI app.config解决方案不适用。

  • 使用Application Data文件夹,但是this给了我错误的路径 - 我使用的是Windows 7,这可能就是原因,但我希望我的部署可以在Windows XP ++上运行。< / p>

  • 在启动时读取应用程序路径(来自here)(将其放在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,但这肯定是凌乱的吗?

非常感谢任何帮助 - 谢谢!


编辑:

使用此:

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 个答案:

答案 0 :(得分:1)

感谢所有输入和提示。它帮助我找到了这个解决方案。希望它可以帮助其他人在一个地方获得信息。这个解决方案非常简单,可能不适合全面的商业部署!

  • 在VSS10中的FileSystem(安装程序) 将配置文件放在用户的 应用程序数据文件夹\产品名称
  • 将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);

一些真正帮助我的有用链接是:

我对此有任何进一步的帮助表示感谢,因为我确信有更精确和灵活的解决方案(例如在安装时处理“所有用户”选项)。