2012-03-26 3 views
1

Звонки в GetFileSecurityW из VBA всегда возвращают «Файл не найден», даже если дескриптор файла можно получить с помощью CreateFileW. Пример нижеGetFileSecurityW всегда возвращает Файл не найден

sUnicode = MakeUnicode(szfilename) 
    Debug.Print sUnicode 
    bSuccess = GetFileSecurityW(StrPtr(MakeUnicode(szfilename)), OWNER_SECURITY_INFORMATION, 0, 0&, _ 
           sizeSD) 
    Debug.Print ErrorMsg(Err.LastDllError) 


    Const GENERIC_READ As Long = &H80000000 
    Const OPEN_EXISTING = &H3 
    Const FILE_SHARE_READ = &H1 
    Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20 
    Const FILE_ATTRIBUTE_HIDDEN As Long = &H2 
    Const FILE_ATTRIBUTE_READONLY As Long = &H1 
    Const FILE_ATTRIBUTE_SYSTEM As Long = &H4 
    Const FILE_ATTRIBUTE_NORMAL = &H80& 

    Dim Flags As Long, Access As Long 
    Dim Disposition As Long, Share As Long 

    Access = GENERIC_READ 
    Share = FILE_SHARE_READ 
    Disposition = OPEN_EXISTING 
    Flags = FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_NORMAL _ 
      Or FILE_ATTRIBUTE_READONLY Or FILE_ATTRIBUTE_SYSTEM 

    Debug.Print CreateFileW(StrPtr(sUnicode), Access, Share, ByVal 0&, Disposition, Flags, 0&) 

вывода Debug из UNC путь к файлу был

\\?\UNC\kazw029530\Test Long File Folder Name\DAFF004 - ICON\201104 DAFF004 ICON SR3 LOMP3P WBS FGOV-5100035-01-10 110506 LOMP003P RiskAnalysis vA1 4.xls 
The system cannot find the file specified. 

4448 

ответ

0

К сожалению, не все функции Windows API поддерживают префикс \\?\. CreateFileW does, GetFileSecurityW этого не делает. Документация указывает, поддерживает ли ее функция.

Таким образом, вы должны использовать имя файла без этого префикса, что ограничивает его длину до MAX_PATH символов.

Смежные вопросы