沒有躲過的坑--你開發的軟體安裝在C盤Program Files (x86)下產生的異常

來源:互聯網
上載者:User

標籤:

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

沒有躲過的坑--你開發的軟體安裝在C盤Program Files (x86)下產生的異常

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.