c++ - 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
}
}
解决方案
推荐阅读
- google-analytics - 谷歌分析 - 上次跟踪导致以前的跟踪记录发生变化
- reactjs - 如何在反应中从 404 错误页面重定向到主页?
- reactjs - Android Studio v 3.3 在构建反应原生应用程序时出现错误
- java - Kotlin setOnClickListener 使用方法参考不起作用
- javascript - HTML5 Drag'n'Drop - 不适用于 iOS 12.1.2(Safari 和 Chrome)
- python - 将键:值对从字节串转换为字符串的最佳方法是什么?
- powershell - Powershell脚本在文件中查找文件名并将其移动到不同的目录
- r - 使用列号(不是列名)执行功能
- java - Spring Oauth2 重定向 uri 不会改变
- codenameone - 代号一 - 在运行时修改 AutoCompleteTextField 数据