代码之家  ›  专栏  ›  技术社区  ›  mwolfe02

Windows 7中的GetOpenFilename api调用不允许直接访问我的文档

  •  3
  • mwolfe02  · 技术社区  · 16 年前

    在我的许多Access(2002)程序中,我使用comdlg32.dll中的GetOpenFileNameA和GetSaveFileNameA函数。我经常将初始目录设置为用户的“我的文档”文件夹(使用shell32中对SHGetSpecialFolderLocation和SHGetPathFromIDListA的调用)。这一切在Windows XP下都可以正常工作。

    但是,我最近切换到Windows 7作为我的开发环境,并收到以下错误消息:

    这个节目。请换一种

    我用来获取“我的文档”位置的函数是返回正确的文件夹。然而,即使我将该目录位置硬编码到GetOpenFileNameA调用中,我仍然会得到错误。

    http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/3391f1dd-25b0-4102-9d5c-58309cc72c9d 但是,即使将其改为使用Access而不是Excel,我也没有运气。

    编辑: 突然间,这对我来说不再是问题了。我怀疑windows更新解决了这个问题。有人知道这是真是假吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Jerry Coffin    16 年前

    Windows7增加了“库”的概念,它基本上是一个虚拟文件夹,包含至少两个实际子目录的内容。它使用库的一个地方是“我的文档”文件夹,该文件夹(至少在默认情况下)是一个库,其中包括用户的文档目录(“c:\users\Where\Documents”)和公共文档目录(“c:\users\public\Documents”)。

    因此,您使用的基本方法根本无法工作——没有表示Documents文件夹的路径。documents文件夹需要由PIDL而不是路径指定。

    编辑:如果无法打开C:\users\user\Documents,则不清楚发生了什么。C++中的快速测试使用代码,如:

    OPENFILENAME data = {0};
    wchar_t filename[256] = {0};
    
    data.lpstrInitialDir = L"C:\\users\\jerry\\documents";
    data.lStructSize = sizeof(data);
    data.lpstrFile = filename;
    data.nMaxFile = sizeof(filename);
    
    GetOpenFileName(&data);
    

        2
  •  1
  •   mwolfe02    16 年前

    我在原始问题中发布的链接( http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/3391f1dd-25b0-4102-9d5c-58309cc72c9d )毕竟,我没有得到答案。我在这里总结一下。要修复此行为,您需要删除所有受影响程序的shell兼容性注册表项中的STRIPFOLDERBIT标志。

    将以下键的STRIPFOLDERBIT重命名为xSTRIPFOLDERBIT(如适用):

    HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Applications\msaccess.exe HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ShellCompatibility\Applications\excel.exe HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\ShellCompatibility\Applications\msaccess.exe

    推荐文章