希望在这里得到一些帮助,因为我正在撕扯我的头发!我正在使用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。也许这适合调试模式?还是开发机器?
答案 0 :(得分:1)
感谢所有输入和提示。它帮助我找到了这个解决方案。希望它可以帮助其他人在一个地方获得信息。这个解决方案非常简单,可能不适合全面的商业部署!
[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);
一些真正帮助我的有用链接是:
我对此有任何进一步的帮助表示感谢,因为我确信有更精确和灵活的解决方案(例如在安装时处理“所有用户”选项)。