visual studio 2010 - mfcc++参考INI文件在部署后的应用程序文件夹

visual studio 2010 - MFC C++ Reference INI file in application folder after deployment

本文关键字:部署 文件夹 应用程序 文件 INI 2010 studio mfcc++ 参考 visual      更新时间:2023-10-16

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

我有一个MFC c++应用程序部署。我有一个config.ini文件,我想在exe启动时引用它。目前,用户不能双击*。myfile并打开它,因为应用程序没有在应用程序文件夹中"启动"(我正在安装ini文件的地方),因此无法找到ini。我尝试了以下

  • 我试图找到关于设置&打开操作的"开始"文件夹的信息,但找不到任何信息。

  • 我找不到任何关于在安装时设置ini文件的注册表值的信息,因为这将是一个相对的参考,取决于用户的选择,所以这并不适用。

  • 它是非托管的,所以c++/CLI的app.config解决方案不适用。

  • 使用应用程序数据文件夹,但这给了我错误的路径-我使用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,但这肯定是混乱的?

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


编辑:

使用这个:

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。也许这是正确的调试模式?还是开发机器?

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

  • 在VS2010中的文件系统(设置)将配置文件放在用户目录中应用程序数据文件夹产品名称
  • 将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);

在这方面对我帮助很大的链接有:

  • 如何在C中获得%AppData%文件夹?
  • http://msdn.microsoft.com/en-us/library/206sadcd.aspx
  • http://www.vbforums.com/showthread.php?t=491920
  • http://jedej.com/2011/02/22/constant-special-item-id-list-windows-special-folders/
  • http://www.codeproject.com/Messages/2623871/using-CSIDL_APPDATA-or-CSIDL_COMMON_APPDATA.aspx

我很感激任何进一步的帮助,因为我相信有更完善和灵活的解决方案(例如处理"所有用户"的安装选择)。