沒有躲過的坑

2021-12-29 22:28:46 字數 1318 閱讀 5966

今天偶然發現的問題,就是自己寫的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的...