没有躲过的坑--你开发的软件安装在C盘Program Files (x86)下产生的异常
2015-12-03 20:46
399 查看
今天偶然发现的问题,就是自己写的win32程序安装在C盘Program Files (x86)文件夹下就会产生异常,而安装在其他文件夹,即使是D盘的Program Files (x86)下,程序也可以完美运行。
引起这个,肯定是权限的问题。这个软件运行时,需要读写数据库,以及各种缓存数据。
这就是我给自己挖的一个坑儿,相信很多人也会遇到这个问题。
就是在开发程序、VS调试的时候,总喜欢使用当前路径,或者是相对路径。即把一些数据与.exe文件放在一起。
但是安装的时候,选择的是C盘Program Files (x86)文件夹,那么就意味着数据库、以及各种缓存数据的读写也都在文件夹Program Files (x86)中进行,这样有时候就会产生权限的问题。
静下来,沉思一下。看了看QQ,就算是把QQ安装在Program Files (x86)文件夹下,你会发现,在“文档”(XP是“我的文档”)下面会产生一个Tencent Files文件夹,用于存放各种数据。
我们知道,读写“文档”下的内容是不需要权限的。
这就指导我们在存在数据库等缓存文件时,最好放在“文档”下面。
接下的问题就是程序中如何获得“文档”文件夹呢?
使用函数SHGetFolderPath:
HRESULT SHGetFolderPath(
HWND hwndOwner,
int nFolder,
HANDLE hToken,
DWORD dwFlags,
LPTSTR pszPath
);
以上为函数原型,其中nFolder指定要获取的目录(具体参考MSDN说明)
CSIDL_BITBUCKET 回收站
CSIDL_CONTROLS 控制面板
CSIDL_DESKTOP Windows 桌面Desktop
CSIDL_DESKTOPDIRECTORY Desktop的目录
CSIDL_DRIVES 我的电脑
CSIDL_FONTS 字体目录
CSIDL_NETHOOD 网上邻居
CSIDL_NETWORK 网上邻居虚拟目录
CSIDL_PERSONAL 我的文档
CSIDL_PRINTERS 打印机
CSIDL_PROGRAMS 程序组
CSIDL_RECENT 最近打开的文档
CSIDL_SENDTO “发送到”菜单项
CSIDL_STARTMENU 任务条启动菜单项
CSIDL_STARTUP 启动目录
CSIDL_TEMPLATES 文档模板
引起这个,肯定是权限的问题。这个软件运行时,需要读写数据库,以及各种缓存数据。
这就是我给自己挖的一个坑儿,相信很多人也会遇到这个问题。
就是在开发程序、VS调试的时候,总喜欢使用当前路径,或者是相对路径。即把一些数据与.exe文件放在一起。
但是安装的时候,选择的是C盘Program Files (x86)文件夹,那么就意味着数据库、以及各种缓存数据的读写也都在文件夹Program Files (x86)中进行,这样有时候就会产生权限的问题。
静下来,沉思一下。看了看QQ,就算是把QQ安装在Program Files (x86)文件夹下,你会发现,在“文档”(XP是“我的文档”)下面会产生一个Tencent Files文件夹,用于存放各种数据。
我们知道,读写“文档”下的内容是不需要权限的。
这就指导我们在存在数据库等缓存文件时,最好放在“文档”下面。
接下的问题就是程序中如何获得“文档”文件夹呢?
使用函数SHGetFolderPath:
std::wstring GetDocumentsPath() { TCHAR my_documents[MAX_PATH]; HRESULT result = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, my_documents); return std::wstring(my_documents); }
HRESULT SHGetFolderPath(
HWND hwndOwner,
int nFolder,
HANDLE hToken,
DWORD dwFlags,
LPTSTR pszPath
);
以上为函数原型,其中nFolder指定要获取的目录(具体参考MSDN说明)
CSIDL_BITBUCKET 回收站
CSIDL_CONTROLS 控制面板
CSIDL_DESKTOP Windows 桌面Desktop
CSIDL_DESKTOPDIRECTORY Desktop的目录
CSIDL_DRIVES 我的电脑
CSIDL_FONTS 字体目录
CSIDL_NETHOOD 网上邻居
CSIDL_NETWORK 网上邻居虚拟目录
CSIDL_PERSONAL 我的文档
CSIDL_PRINTERS 打印机
CSIDL_PROGRAMS 程序组
CSIDL_RECENT 最近打开的文档
CSIDL_SENDTO “发送到”菜单项
CSIDL_STARTMENU 任务条启动菜单项
CSIDL_STARTUP 启动目录
CSIDL_TEMPLATES 文档模板
相关文章推荐
- iOS开发之图片拉伸
- The connection to adb is down, and a severe error has occured.
- session cursor
- gdutcode Stubird与他的女粉丝
- onFinishInflate()、onMeasure()、onLayout()的调用顺序
- while,do while和for循环语句的用法
- BZOJ1079: [SCOI2008]着色方案
- C语言之宏
- 【bzoj1132】[POI2008] Tro
- LDA算法学习(Matlab实现)
- error occurred during initialization of vm
- HPU ACM15级周练
- JAVA生成图片验证码API
- window系统快捷键
- 第十三周学习报告
- 操作数据库类SQLHelp.cs
- window对象
- HDU 1103 Restaurant
- 0707什么是JSON+如何处理JSON字符串0
- 扣丁学堂——Activity(一)