64位Windows文件打开
64 bit windows file opening
我正在尝试使用对话框打开我的程序中的文件。这在32位系统上完美地工作,但是当我试图在64位系统上使用它时,它无法打开文件。我发现,如果要打开的文件与我的程序在同一目录下,它就可以正常工作。但是,尝试从另一个文件夹打开文件,根本不工作。
所以,我试着把文件复制到程序文件夹。这在32位系统上也可以很好地工作,但在64位系统上根本不起作用。有什么想法吗?
char cwdl[500];
getcwd(cwdl,500);
string mystring = string(cwdl);
CFileDialog fileDlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, "All Files (*.*)|*.*||", this);
fileDlg.m_ofn.lpstrTitle = "Select New File";
if( fileDlg.DoModal() == IDOK)
{
CString newFile= fileDlg.GetFileName();
mystring+="\"+newFile;
const char * newLoc = mystring.c_str();
CopyFile(newFile,newLoc,true);
这只是一小段代码
UAC和文件系统重定向既相关又不同。
用户帐户控制是基于权限的安全性,以防止未经授权的用户更改您的文件系统或执行可能影响其他用户的应用程序。提示符允许您通过临时提供管理员权限来覆盖安全性,如果这是您的意图的话。
文件系统重定向是通过镜像32位系统文件夹和注册表来允许向后兼容32位应用程序。事实上,如果动作导致UAC踢重定向没有发生,它将始终尝试使用64位版本的文件在这种情况下。除非您显式指定重定向目录或以管理员权限运行32位应用程序以绕过UAC。
Ok,上面说你正在使用一个相对路径,所以它会在当前目录中为进程查找文件。如果它被编译为32位进程,在不同体系结构的系统上运行它可能会由于前面提到的重定向而表现得不像预期的那样。
你可以使用GetCurrentDirectory windows API来查看当前进程正在使用的目录,并验证它是你所期望的。如果没有,你有几个选择。
- 最简单的方法是使用完全限定的文件路径。
- 您也可以有两个构建,一个针对您打算部署的每个体系结构。毕竟,如果你在64位系统上,你也可以部署64位应用程序。
- 一个更复杂的选择是子类化
CFileDialog
并通过在构造函数中调用Wow64DisableWow64FsRedirection
和在构造函数中调用Wow64RevertWow64FsRedirection
来禁用重定向。然而,这意味着这是一个系统设置,所以你可能会得到新的问题,强迫你的32位应用程序在64位窗口。
可能还有很多其他的选择,因为通常有很多方法来剥猫的皮。但是,第一步是放置一些调试代码,并使用GetCurrentDirectory
也许是我的问题,但我看到了一个奇怪的结果:在64位模式下,用于存储路径位置的缓冲区的前四个字节都用零填充。
char wk[_MAX_PATH];
char *ret = _getcwd(wk, _MAX_PATH); // wk = " C:\MyFolder\..."
// ret = "C:\MyFolder\..."
返回值OTOH正确。"ret"指向周+ 4;
在32位模式下,没有前导零,路径从第一个字节开始。注意:这是一个多字节的应用程序,而不是Unicode。
我使用的是Visual Studio 2010 (10.0.40219.1 SP1Rel)。
无论如何,如果你得到相同的结果,这就解释了为什么你的例子不起作用。您必须说(仅在64位模式下):
string mystring = string(cwdl + 4); // 64-bit only
奇怪还是什么?
编辑:似乎是对齐问题。如果_getcwd在一个单独的函数中,则工作正常。
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- vcruntime.h 从 Windows 包含文件夹中丢失?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 如何在Windows内核中获取文件大小
- Qt自动生成的.rc文件无法打开包含文件'windows.h'
- MinGW GCC通配符编译所有文件(Windows)
- QTCreator G .EXE:致命错误:无输入文件(Windows)
- 切割和粘贴后监视文件(Windows shell扩展?)
- 如何读取目录中包含的所有文件 (WINDOWS)
- WebCam预览和捕获到文件(Windows)
- 从 c++ 中的当前目录复制文件(Windows API)
- 我可以将一个可执行文件与另一个可执行文件(Windows 服务程序)组合在一起,并将该程序作为逻辑服务运行吗?
- C++锁定文件Windows阻止模式
- 正在将明文AES 128密钥导出到缓冲区/文件Windows Crypto API c++
- 有效删除文件Windows c++