[英]Why does my code fail to create a directory in “C:\Program Files” under Windows 7?
我正在使用Windows 7,並且必須在該Windows中運行一個程序,但該程序在Windows XP中可以運行。 這是一個Visual C ++程序,為此我正在使用Visual Studio 2008。 當我運行我的應用程序時,它不會引發任何錯誤,但是不會在“ c:\\ program files \\”中創建目錄。 那么有人可以幫助我創建目錄和exe文件嗎?
這是我正在使用的代碼:
char szAppPath[MAX_PATH];
char szFileName[MAX_PATH];
DWORD dwResult;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
dwResult = ExpandEnvironmentStrings( NULL, szAppPath, MAX_PATH); // "%ProgramFiles%"
// do same for NSim directory
strcat(szAppPath,"\\NSim");
hFind = FindFirstFile(szAppPath, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
//Directory Does't Exists create New
if(!CreateDirectory(szAppPath,NULL)) //Throw Error
{
MessageBox("Unable to Create N-SIM directory","NSim Installer");
return ;
}
}
else
{
//check if is directory or not
if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
MessageBox("Can't Create N-SIM directory\n Another file with same name exists","NSim Installer");
return ;
}
FindClose(hFind);
}
//***************************************N-SIM Application****************************
strcpy(szFileName, szAppPath);
HRSRC hRes;
if( bRegister == FALSE)
{
strcat(szFileName,"\\NSim.exe"); //make same name of the Client & Server in program file
hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_LANSIMSERVER),RT_RCDATA);
if(flagUpgrade ==0)
{
CString trial = installationDate(); //----- Detemine Expiry Date -----
setRegistry(trial);
}
}
這是一個簡單而簡單的文件權限問題。 程序不能僅僅扎根於Windows 7的系統目錄中。這就是為什么它可以在Windows XP中“正常”運行,而不是在較新版本中運行的原因。
我無法確定,但看起來您正在嘗試編寫安裝程序。 如果是這樣,為什么還要重新發明輪子呢? 有大量出色的設置實用程序可供使用-Visual Studio提供了一個安裝項目,您可以根據需要對其進行自定義,或者查看我個人最喜歡的Inno Setup 。 Google搜索將提供許多其他選項,這些選項已經為您解決了這個問題,還有無數其他選擇。
如果這不是安裝程序,而您只是想將應用程序和/或用戶數據存儲在Program Files文件夾中,則強烈建議您將其放在其他位置。 您不應該將數據推送到早期版本的Windows下的app文件夾中,如果執行此操作,Windows 7只會讓您屈膝。 最好的選擇是遵循從一開始就存在的建議:仔細研究用戶和公用Application Data文件夾。 使用SHGetKnownFolderPath功能使用其檢索到已知文件夾的完整路徑KNOWNFOLDERID 。 一些建議:
FOLDERID_ProgramData
(所有用戶的共享程序數據目錄) FOLDERID_LocalAppData
(每用戶程序數據目錄,非漫游) FOLDERID_RoamingAppData
(每用戶程序數據目錄,漫游) 或者,您可以嘗試以管理員身份運行該應用程序。 您可能需要研究創建一個清單 , 該清單指示該應用程序需要管理員級別的權限才能執行。
Windows 7的? 好的,問題不在您的程序上。 它具有Windows 7中的文件系統權限。用戶程序無法在其中創建文件。
[編輯]我編輯了問題中的代碼以提高可讀性,並刪除了注釋掉的代碼(以查看樹木的樹木)。 這是現在很明顯, 沒有調用的strcat(),並調用初始化之前szAppPath ExpandEnvironmentStrings
用NULL作為第一個參數是不確定的 (當然沒用)。 在單元化的字符串上調用strcat()
不太可能獲得所需的結果。 這可能是不發布真實代碼或什至是其他人的修改(包括我的代碼)的人工產物。
CreateDirectory
設置錯誤時的系統錯誤代碼; 如果您想知道出了什么問題,請檢查一下! 您在這里得到的任何答案都是有根據的猜測。
if(!CreateDirectory(szAppPath,NULL)) //Throw Error
{
DWORD errorcode = GetLastError();
LPVOID lpMsgBuf;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, errorcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK);
return ;
}
如果您只想獲取錯誤代碼並手動查找,則MSDN上提供了完整的代碼目錄,在這里 ,我想 ERROR_ACCESS_DENIED (5)
最有可能。 這里給出了錯誤代碼顯示的更詳細的示例。
我認為問題在於缺乏特權。 您可以調試項目以查看CreateDirectory
函數是否將錯誤設置為ERROR_ACCESS_DENIED
,如果確實如此,則應以管理員權限運行程序。 為此,請在您的項目中添加清單。
它旨在保護您的計算機免受攻擊。 也許會。 或Microsoft決定告訴您您是什么,並且不允許您在自己的計算機上做什么。
在任何情況下,如果您確實必須以這種方式編寫,都可以更改UAC設置,盡管這顯然會使您面臨風險。
否則,請使用適當的安裝程序,以不錯的方式播放並以Microsoft的方式執行操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.