今天偶然發現的問題,就是自己寫的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() 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 文件模板
沒有躲過的坑
工作中是這樣的,a類中有乙個成員變數x,最開始宣告為私有 class a 現在需要在另乙個cpp中使用這個x,所以要把它變為共有並且靜態 class a 由此可見 靜態資料成員和普通資料成員一樣遵從public,protected,private訪問規則。此時,編譯,我們會得到乙個錯誤,原因就是x沒...
沒有躲過的坑 指標(記憶體洩露)
c 被人罵娘最多的就是指標。夜深人靜的時候,拿出幾個使用指標容易出現的坑兒。可能我的語言描述有些讓人費勁,盡量用 說話。通過指向類的null指標呼叫類的成員函式 試圖用乙個null指標呼叫類的成員函式,導致崩潰 include using namespace std class a void set...
沒有躲過的坑 重定義關鍵字
從學習程式語言開始,我們就知道變數或是函式的命名不能使用系統的關鍵字。但是有時候,你不得不這麼做。比如mac ios android windows共用乙個底層 這樣為了使底層更加通用,有時候就會忽略某種語言的某個關鍵字。也許關鍵字a對於win32就是乙個系統關鍵字,而a不是objective c的...