首页 > 解决方案 > fopen_s 使用系统帐户和 win 32 返回错误代码 2,但在 winx64 (c++) 上工作正常

问题描述

我有一个 cpp 程序,它使用 fopen_s 打开和读取在 C:\Windows\System32\config\systemprofile\AppData\Roaming 目录下创建的文件。

我的程序需要兼容winx64和win32。

当我使用系统帐户运行此程序(使用 PSTools\PSExec -i -s C:\windows\system32\cmd.exe 运行)和程序的 Win32 编译版本时,“C:\ Windows\System32\config\systemprofile\AppData\Roaming" 返回错误代码 2,即使该文件存在。但是,当我运行同一个程序的 x64 编译版本时,它运行良好,并且 fopen_s() 能够找到并打开同一个文件。

我确信将有效的文件名传递给 fopen_s() 没有错误,我已经验证了这一点。

我确保每次调用 fopen_s() 之前,将存储 fopen_s() 返回值的 int 变量设置为 0。我在“r”模式下调用 fopen_s()。

此外,在同一程序的其他地方,我可以在同一目录下创建文件。

我正在使用 VS2019 和 cpp +11 来编译我的程序。我的系统在 x64 处理器(Intel(R) Xeon(R) Gold 6136)上运行 Windows 10(64 位)

为什么 win32 应用程序无法使用系统帐户读取在“C:\Windows\System32\config\systemprofile\AppData\Roaming”下创建的文件,而同一应用程序的 x64 版本工作正常?

代码片段:

int FileOpenFunc(FILE ** ppFile, std::string sFilename, std::string sOpenMode)
{
    int errOpen = 0;
#ifdef _WIN32
    errOpen = fopen_s(ppFile, sFilename.c_str(), sOpenMode.c_str());
#else
    *ppFile = fopen(sFilename.c_str(), sOpenMode.c_str());
    errOpen = errno;
#endif
    return errOpen;
}

void func()
{
    std::string sFileName = "C:\\Windows\\System32\\config\\systemprofile\\AppData\\Roaming\\Check\\sample.txt";
    int errFopenErrNo = 0;
    FILE* fp = NULL;
    errFopenErrNo = FileOpenFunc(&fp, sFileName, "r");

    if (fp!= NULL)
    {
        //do something
    }
    else
    {
        //do something else
    }
}

标签: c++windowsfopenwin32-processwin64

解决方案


推荐阅读