API-вызов GetOpenFilename в Windows 7 не разрешает прямой доступ к моим документам - PullRequest
3 голосов
/ 15 декабря 2009

Во многих моих программах Access (2002) я использую функции GetOpenFileNameA и GetSaveFileNameA из comdlg32.dll. Я часто устанавливаю начальный каталог в папку «Мои документы» пользователя (используя вызовы SHGetSpecialFolderLocation и SHGetPathFromIDListA из shell32). Все это прекрасно работает под Windows XP.

Однако недавно я перешел на Windows 7 в качестве среды разработки и получаю следующее сообщение об ошибке:

Вы не можете открыть это местоположение, используя эта программа. Пожалуйста, попробуйте другой место.

Функция, которую я использую для определения местоположения «Мои документы», возвращает правильную папку. Однако даже если я жестко закодирую это местоположение каталога в вызове GetOpenFileNameA, я все равно получаю сообщение об ошибке.

Я сталкивался с этим сообщением: http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/3391f1dd-25b0-4102-9d5c-58309cc72c9d, но, даже адаптировав его для работы с Access вместо Excel, мне не повезло.

РЕДАКТИРОВАТЬ: Внезапно это больше не проблема для меня. Я подозреваю, что обновление Windows вышло для решения этой проблемы. Кто-нибудь знает, правда это или нет?

РЕДАКТИРОВАТЬ: Оказывается, это все еще проблема. Кроме того, в случае, если это помогает в устранении неполадок, я обнаружил, что я получаю это сообщение об ошибке для любого из специальных местоположений папки (Моя музыка, Мои документы и т. Д.). Кроме того, если я изменю расположение папки «Моя музыка», скажем, на «C: \ Test», то при попытке открыть папку «C: \ Test» я получаю это сообщение, а папка «C: \ Users \ Mike \ Music» ( Исходное местоположение «Моя музыка») открывается без заминки.

Ответы [ 2 ]

1 голос
/ 22 июня 2010

Ссылка, которую я разместил в моем исходном вопросе (http://social.msdn.microsoft.com/Forums/en-US/windowsuidevelopment/thread/3391f1dd-25b0-4102-9d5c-58309cc72c9d), в конце концов содержала ответ. Я приведу здесь краткие сведения. Чтобы исправить это поведение, вам нужно избавиться от флага STRIPFOLDERBIT в реестре совместимости оболочки запись для всех затронутых программ.

Имейте в виду (и это меня так запутало), что 32-битные программы имеют записи в специальном разделе реестра, если у вас 64-битные окна. Вот быстрый и грязный:

Переименуйте STRIPFOLDERBIT в xSTRIPFOLDERBIT для следующих ключей (в зависимости от ситуации):

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ShellCompatibility \ Applications \ excel.exe HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ ShellCompatibility \ Applications \ msaccess.exe HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ ShellCompatibility \ Applications \ excel.exe HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ ShellCompatibility \ Applications \ msaccess.exe

1 голос
/ 15 декабря 2009

В Windows 7 добавлено понятие «библиотека», которая в основном представляет собой виртуальную папку, которая содержит содержимое как минимум двух реальных подкаталогов. Одно из мест, где она использует библиотеку, - это папка «Мои документы», которая (по крайней мере по умолчанию) является библиотекой, которая включает в себя как каталог документов пользователя («c: \ users \ whoever \ documents»), так и каталог общедоступных документов (C :. \ Users \ Public \ 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);

OTOH, нет необходимости указывать начальный путь - папка Documents в любом случае используется по умолчанию.

...