簡體   English   中英

為什么我的代碼無法在Windows 7下的“ C:\\ Program Files”中創建目錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM