Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的代码无法在";中创建目录;C:\ProgramFiles";在Windows7下?_C++_Windows_Visual C++_Windows 7_Uac - Fatal编程技术网

C++ 为什么我的代码无法在";中创建目录;C:\ProgramFiles";在Windows7下?

C++ 为什么我的代码无法在";中创建目录;C:\ProgramFiles";在Windows7下?,c++,windows,visual-c++,windows-7,uac,C++,Windows,Visual C++,Windows 7,Uac,我使用的是Windows7,我必须在该Windows中运行一个程序,但该程序在WindowsXP中运行。这是Visual C++程序,我使用VisualStudio 2008进行此操作。当我运行应用程序时,它不会抛出任何错误,但不会在“c:\program files\”中创建目录。有人能帮我创建目录和exe文件吗 这是我正在使用的代码: char szAppPath[MAX_PATH]; char szFileName[MAX_PATH]; DWORD dwResult; WIN32_FIND

我使用的是Windows7,我必须在该Windows中运行一个程序,但该程序在WindowsXP中运行。这是Visual C++程序,我使用VisualStudio 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);
    }
}
windows7?
好的,问题不在于你的程序。它具有Windows 7中的文件系统权限。用户程序无法在那里创建文件。

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

我不能确定,但看起来你正在尝试编写一个安装程序。如果是这样,你为什么要重新发明轮子?Visual Studio提供了一个安装项目,您可以根据自己的需要进行自定义,也可以查看我个人的最爱。谷歌搜索会发现很多其他选项,这些选项已经为你和无数其他人解决了这个问题

如果这不是一个安装程序,而您只是试图将应用程序和/或用户数据存储在Program Files文件夹中,我强烈建议您去别处看看。你不应该把数据塞进Windows早期版本下的应用程序文件夹,如果你这样做的话,Windows 7会把你的膝盖割断。您最好遵循从一开始就存在的建议:仔细调查用户和常用应用程序数据文件夹。使用检索到已知文件夹的完整路径。有几点建议:

  • FOLDERID\u ProgramData
    (所有用户共享的程序数据目录)
  • FOLDERID\u LocalAppData
    (每用户程序数据目录,非漫游)
  • FOLDERID\u RoamingAppData
    (每用户程序数据目录,漫游)
或者,您可以尝试以管理员身份运行应用程序。您可能需要查看是否表明应用程序需要管理员级别的权限才能执行。


[edit]为了可读性,我编辑了问题中的代码,并删除了注释掉的代码(以树见木)。现在很明显,在调用strcat()之前,没有任何东西会初始化szAppPath,并且使用NULL作为第一个参数调用
ExpandEnvironmentStrings
是未定义的(当然也没有用)。在统一化的字符串上调用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 ;
}
如果您只想获取错误代码并手动查找,那么上有完整的代码目录,我猜
error\u ACCESS\u DENIED

(5)
是最有可能的。给出了一个更详细的错误代码显示示例。

我认为问题在于缺乏权限。您可以调试项目,查看
CreateDirectory
函数是否将错误设置为
error\u ACCESS\u DENIED
,如果设置了,则应使用管理员权限运行程序。在项目中添加清单以执行此操作。

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

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


否则,请使用合适的安装程序,以Microsoft的方式进行操作。

字符串转义很差。而不是
C:\NSim
write
C:\\NSim
。显然,在重新格式化时,İsmail'cartman'Dönmez“修复”了字符串转义问题……我已经在程序中使用了它,但它仍然没有创建文件夹。请再给我一个solutions@goreSplatter:字符串在原始源代码中已正确转义,但由于文本未格式化为源代码,因此未显示这些字符串。伊斯梅尔所修复的只是代码格式——我检查了一下,因为我同意你的观点,像这样的东西不应该被“编辑”。@Cody谢谢你指出这一点。因为我仍然有点缺少rep,所以我看不到源代码…看这个:并且,尽量避免使用您自己的程序作为其他程序的安装程序。即使你有自定义的用户界面和自定义的这个和那个,许多安装程序制造商也可以选择在安装过程中插入你自己的dll并从你的dll调用函数。你能告诉我这个过程吗?你希望在你的安装程序中有什么额外的东西(除了复制文件之外)?我的exe文件也不会显示在桌面和启动菜单上。嗨,我有所有权限。你能告诉我其他的逻辑吗?@sunil:你是怎么证实的?UAC强制执行权限方式的不同很可能是您的代码在Windows XP上按预期工作的原因,而不是在Windows的更高版本上。是的,我已确认。此代码在windowsxp中运行,但在windows7操作系统中不运行。我可以用其他东西来代替这个代码吗?@sunil:在发表评论之前,你真的读过我的答案了吗?我至少提供了3种不同的建议,说明您可以做些什么。@sunil:阅读Inno安装程序附带的和帮助文件。还包括一些示例安装程序脚本。该网站有一个包含补充信息的网站。一个快速的谷歌搜索显示。使用起来真的不是很难。不要束手无策。@sunil.nishad87:那就修好它吧!只是它很明显是这样的!: