64位Windows文件打开

时间:2011-08-01 14:34:58

标签: c++ windows mfc 64-bit

我正在尝试使用对话框在程序中打开文件。这在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);

这只是代码片段。

2 个答案:

答案 0 :(得分:1)

UAC和文件系统重定向相关但不同。

用户帐户控制是一种基于权限的安全措施,可防止未经授权的用户更改文件系统或执行可能影响其他用户的应用程序。提示允许您通过临时提供管理员权限来覆盖安全性,如果这是您的意图。

文件系统重定向是通过拥有镜像的32位系统文件夹和注册表来允许向后兼容32位应用程序。事实上,如果操作导致UAC启动重定向不会发生,那么在这种情况下它总是会尝试使用64位版本的文件。除非您明确指定重定向目录或运行具有管理员权限的32位应用程序以绕过UAC。

好的,说您正在使用相对路径,因此它将在当前目录中查找该进程的文件。如果它被编译为32位进程,则在具有不同体系结构的系统上运行它可能由于上述重定向而无法按预期运行。

您可以使用GetCurrentDirectory Windows API查看当前进程使用的目录,并验证它是否符合您的预期。如果没有,你有几个选择。

  • 最简单的方法是使用完全限定的文件路径。
  • 您还可以为要部署的每个体系结构设置两个目标。毕竟,如果你使用64位系统,你也可以部署64位应用程序。
  • 更复杂的选项是子类CFileDialog并通过在构造函数中调用Wow64DisableWow64FsRedirection并在析构函数中调用Wow64RevertWow64FsRedirection来禁用重定向。但是,这是一个系统设置,因此您可以通过在64位窗口上强制使用32位应用程序来解决新问题。

可能还有很多其他选择,因为通常有许多方法可以给猫皮肤涂抹。然而,第一步是放置一些调试代码并验证或消除重定向作为GetCurrentDirectory

的罪魁祸首

答案 1 :(得分:0)

也许只是我,但我看到了一个奇怪的结果:在64位模式下,缓冲区的前四个字节用于存储路径的位置,用零填充。

char wk[_MAX_PATH];
char *ret = _getcwd(wk, _MAX_PATH);  // wk = "\0\0\0\0C:\\MyFolder\\..."
                                     // ret = "C:\\MyFolder\\..."

返回值OTOH是正确的。 “ret”指向wk + ​​4;

在32位模式下,没有前导零,路径从第一个字节开始。注意:这是一个多字节应用程序,而不是Unicode。

我正在使用Visual Studio 2010(10.0.40219.1 SP1Rel)。

无论如何,如果你得到相同的结果,那就解释了为什么你的例子不起作用。你不得不说(仅限64位模式):

string mystring = string(cwdl + 4);   // 64-bit only

奇怪或什么?

编辑:似乎是对齐问题。如果_getcwd位于单独的函数中,则工作正常。