## 沒有躲過的坑--你開發的軟件安裝在C盤Program Files (x86)下產生的異常
今天偶然發現的問題,就是自己寫的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**:
~~~
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 文檔模板
- 前言
- deprecated關鍵字
- 指針(內存泄露)
- 頭文件相互包含(Compiler error C2653: not a class or namespace name)
- 獲取一張圖片的width和height
- This function or variable may be unsafe.
- 智能指針陷阱
- wstring與string的轉換
- windows下chrome瀏覽器插件不能安裝
- 重定義關鍵字
- 正確釋放vector的內存
- 獲取設備環境HDC
- 抽象類不能實例化對象(但是你明明定義的不是抽象類)
- 重載賦值運算符的自我賦值
- 程序中的變量未初始化
- 成對使用new和delete時要采取相同的形式
- 意想不到的除數為零
- map的初始化(插入數據)
- 正則表達式截取字符串
- 捕獲窗口之外的鼠標消息(鉤子還是??)
- 類中的靜態成員變量(static or const static)
- 有if就要有else(一定成對)
- map查找結果處理
- 使用using namespace std的壞習慣
- new一個指針數組、以及創建動態二維數組
- 使用太多的全局變量
- 沒有及時break出for循環
- vector使用erase后迭代器變成野指針
- C++函數的默認參數(重新定義默認參數)
- 0xC0000005: 讀取位置 xxx時發生訪問沖突
- std::string初始化、最快速判斷字符串為空
- 你開發的軟件安裝在C盤Program Files (x86)下產生的異常