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

sun*_*d87 0 c++ windows uac visual-c++ 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 8

这是一个文件权限问题,简单明了.程序不能仅仅依赖于Windows 7中的系统目录.这就是为什么它在Windows XP中"正常"工作,而不是在新版本中工作.

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

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

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

或者,您可以尝试以管理员身份运行应用程序.您可能希望查看创建清单,指示应用程序需要管理员级别的权限才能执行.