为什么我的代码无法在Windows 7下的“C:\ Program Files”中创建目录?

时间:2011-01-03 09:01:23

标签: c++ windows visual-c++ windows-7 uac

我正在使用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);
    }
}

5 个答案:

答案 0 :(得分:8)

这是一个文件权限问题,简单明了。程序不能只围绕Windows 7中的系统目录。这就是为什么它在Windows XP中“正常”工作,而不是在新版本中

我无法确定,但看起来你正在尝试编写安装程序。如果是这样,你为什么要重新发明轮子?有许多可用的设置实用程序 - Visual Studio提供了一个可以根据您的需求进行自定义的安装项目,或者查看我个人最喜欢的Inno Setup。谷歌搜索将提供许多已经为您解决此问题的其他选项,以及无数其他选项。

如果不是安装程序,并且您只是想在Program Files文件夹中存储应用程序和/或用户数据,我强烈建议您查看其他地方。您不应该将数据推送到早期版本的Windows下的应用程序文件夹中,如果您这样做,Windows 7只会让您瘫痪。您最好的选择是遵循从一开始就存在的建议:仔细调查用户和常见的应用程序数据文件夹。使用SHGetKnownFolderPath function使用KNOWNFOLDERID检索已知文件夹的完整路径。几点建议:

  • FOLDERID_ProgramData(所有用户的共享程序数据目录)
  • FOLDERID_LocalAppData(每个用户程序数据目录,非漫游)
  • FOLDERID_RoamingAppData(每个用户程序数据目录,漫游)

或者,您可以尝试以管理员身份运行该应用程序。您可能希望查看creating a manifest,表明应用程序需要管理员级权限才能执行。

答案 1 :(得分:2)

windows7的? 好的,问题不在于你的程序。它具有Windows 7中的文件系统权限。用户程序无法在那里创建文件。

答案 2 :(得分:2)


[edit] 为了便于阅读,我编辑了问题中的代码并删除了注释掉的代码(查看树木的木材)。现在显而易见的是, nothing 在调用strcat()之前初始化szAppPath,并且使用NULL调用ExpandEnvironmentStrings作为第一个参数是 undefined (当然没用)。在单一化字符串上调用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, here上会提供完整的代码目录,我会猜测 ERROR_ACCESS_DENIED (5)是最有可能的。更详细的错误代码显示示例为here

答案 3 :(得分:1)

我认为问题是缺乏特权。您可以调试项目以查看CreateDirectory函数是否将错误设置为ERROR_ACCESS_DENIED,如果是,则应使您的程序以管理员权限运行。在项目中添加清单即可。

答案 4 :(得分:0)

旨在保护您的计算机免受攻击。也许。或者微软决定告诉你你是什么而不允许在自己的电脑上做。

在任何情况下,如果您真的必须以这种方式在那里写字,您可以更改您的UAC设置,尽管这显然会让您面临风险。

否则,使用适当的安装程序,以微软的方式玩好并做事。