64位Windows文件打开

64 bit windows file opening

本文关键字:文件 Windows 64位      更新时间:2023-10-16

我正在尝试使用对话框打开我的程序中的文件。这在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在一个单独的函数中,则工作正常。