Я вызываю CreateFile (), чтобы создать файл в каталоге Program Data. Я использую SHGetSpecialFolderPath (), чтобы получить имя каталога.
У меня есть пользователь Vista, для которого CreateFile () возвращает ошибку 5 (доступ запрещен). Было бы полезно, если бы я знал, где CreateFile () на самом деле пытается создать файл, чтобы мы могли проверить его права доступа к папке. Проблема с Vista (UAC) в том, что она не пытается создать файл в каталоге, который я передал. Он также может находиться в каталоге VirtualStore. Дополнительным источником путаницы является то, что этот пользователь - немец, и хотя SHGetSpecialFolderPath () возвращает в качестве пути «C: \ Program Data \ blah blah», я не думаю, что на самом деле путь находится именно там. Я думаю, что в немецкой Vista для обозначения программных данных используется немецкое слово. Я хотел бы сообщить пользователю: «Это точный путь, по которому мы пытаемся создать файл. Проверьте свои права доступа к этой папке».
Я знаю, что вы можете получить путь из дескриптора открытого файла, но в этом случае CreateFile () не работает, поэтому у меня нет открытого дескриптора. Как я могу заставить Vista сообщать мне фактический путь, по которому она пытается создать файл?
CSIDL_COMMON_APPDATA
указывал наC:\Documents & Settings\All Users
, и вашCreateFile
тоже потерпит неудачу. (другими словами, сбой характерен не только для Vista, а для вашего приложения. Вы не должны писать в места, где вы тоже не должны писать) - person Ian Boyd   schedule 24.05.2011SHGetSpecialFolderPath
устарел с Windows 2000; используйте вместо этогоSHGetFolderPath
. Новые приложения могут использоватьSHGetKnownFolderPath
. - person Ian Boyd   schedule 24.05.2011