希望在这里得到一些帮助,因为我正在撕扯我的头发!我正在使用 Visual Studio 2010。
我有一个 MFC C++ 应用程序要部署。我有一个 config.ini 文件,我想在 exe 启动时引用它。目前用户无法双击 *.myfile 并打开它,因为应用程序不“从”应用程序文件夹(我正在安装 ini 文件的位置)“开始”,因此找不到 ini。我试过以下方法
我尝试查找有关为 &Open 操作设置“开始于”文件夹的信息,但找不到任何信息。
我找不到任何有关在安装时设置 ini 文件的注册表值的信息,因为这将是一个相对引用,具体取决于用户的选择,因此 this不适用。
它是非托管的,因此 C++/CLI app.config 解决方案不适用。
使用 Application Data 文件夹,但是 this给了我错误的路径 - 我正在使用 Windows 7,这可能就是原因,但我希望我的部署能够在 Windows XP++ 上运行。
在启动时读取应用程序路径(来自 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";
这是最接近的,但在 Debug模式下,路径中有一个奇怪的“\.\”使其无效。我可以使用 #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。也许这适合 Debug模式?还是开发机?
最佳答案
感谢所有的输入和提示。它帮助我找到了这个解决方案。希望它可以帮助其他人将信息集中在一个地方。此解决方案非常简单,可能不适用于完整的商业部署!
- 在 VS2010 的文件系统中(设置) 将配置文件放在用户的 应用程序数据文件夹\产品名称
- 将 InstallAllUsers 设置为 false,这样 你不需要条件条件 您的配置文件位于,基于 用户的安装选择
- 在 InitInstance() 函数中添加 类似于以下内容:
[名单破坏者]
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);
在这方面真正帮助我的一些有用链接是:
- How to get the %AppData% folder in C?
- 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
我将不胜感激任何对此的进一步帮助,因为我确信有更完善和灵活的解决方案(例如,处理安装时的“所有用户”选择)。
关于c++ - 部署后应用程序文件夹中的 MFC C++ 引用 INI 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627701/