GetShortPathNameA не работает в WinXP SP3!

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

GetShortPathNameA не работает в WinXP SP3!

Сообщение jangle » 12.08.2011 (Пт) 10:38

Вот такой ахтунг :evil: На домашнем XP SP2 функция GetShortPathNameA возвращает короткие имена, приношу исходник на работу, там XP SP3, функция GetShortPathNameA не работает! Одна программа, одна папка, только в SP3 короткое имя не возвращается... У Майкрософта окончательно поехала крыша? :(

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.08.2011 (Пт) 11:23

jangle писал(а):Вот такой ахтунг :evil: На домашнем XP SP2 функция GetShortPathNameA возвращает короткие имена, приношу исходник на работу, там XP SP3, функция GetShortPathNameA не работает! Одна программа, одна папка, только в SP3 короткое имя не возвращается... У Майкрософта окончательно поехала крыша? :(

XP SP3 - работает.

Код: Выделить всё
Public Class Form1

Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Integer) As Integer

Private Sub TxtLong_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TxtLong.TextChanged
  Tmr.Stop()
  TxtShort.Text = ""
  Tmr.Start()
End Sub

Private Sub Tmr_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Tmr.Tick
  Tmr.Stop()
  Dim Res As New String(Chr(0), 256), Len As Integer = GetShortPathName(TxtLong.Text, Res, 255)
  TxtShort.Text = Res.Substring(0, Len)
End Sub
End Class

Возможно, дело в другом. Не всегда у файлов/папок есть короткие имена. В реестре есть ключ, отвечающий за создание коротких имён:
Neo Utils -> Tweak Manager -> Файловая система -> Ускорение работы файловой системы NTFS писал(а):Этот параметр останавливает работу части NTFS, отвечающей за создание совместимых с МС-ДОС имен файлов в формате 8.3 . Отключение этого свойства может увеличить эффективность работы в разделах NTFS, с большим количеством файлов имеющих длинные имена. Предупреждение: Некоторые 16 разрядные инсталляционные программы могут иметь проблемы при включении этого параметра, Вы можете или заново включить создание 8.3 имен файлов в течение установки, или использовать имена каталогов не в формате LFN, то есть "c:\progra~1\applic~1".

Расположение: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem - NtfsDisable8dot3NameCreation:REG_DWORD

Рекомендованное значение: 1

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: GetShortPathNameA не работает в WinXP SP3!

Сообщение Alec » 12.08.2011 (Пт) 11:57

Можно и без реестра, с командной строки, узнать:
Код: Выделить всё
fsutil behavior query disable8dot3

установить:
Код: Выделить всё
fsutil behavior set disable8dot3 1|0

и еще, нужно обратить внимание на
fsutil behavior set|query allowextchar

при установке "1" короткие имена с русскими буквами будут выглядеть как обрезанные длинные, иначе - как 16-ричные числа
Иногда лучше вовремя остановиться...
И начать заново!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 12.08.2011 (Пт) 12:03

Насколько я знаю, изменение этого параметра не приводит к созданию отстутствующих коротких имён или удалению старых. Оно действует только на факт создания для новых файлов.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: GetShortPathNameA не работает в WinXP SP3!

Сообщение jangle » 12.08.2011 (Пт) 13:21

Бред какой-то... У меня это пример выдает длинное имя на рабочем и короткое на домашнем компе.

Код: Выделить всё
#Compile Exe
#Dim All
#Include "win32api.inc"
Function GetShortPath (ByVal lfn As Asciiz*255) As String
    Local  sfn As Asciiz*255
    GetShortPathName (lfn, sfn, 255)
    Function = sfn
End Function
Function PBMain () As Long
  Print GetShortPath("C:\Program Files\Microsoft Visual Studio 9.0\Microsoft Visual Studio 2008 Professional Edition - RUS")
  WaitKey$
End Function

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: GetShortPathNameA не работает в WinXP SP3!

Сообщение jangle » 12.08.2011 (Пт) 14:58

Похоже таже проблема что и у меня: GetShortPathName() is not working as I expect on XP SP3

Alec
Бывалый
Бывалый
 
Сообщения: 275
Зарегистрирован: 31.08.2008 (Вс) 0:15
Откуда: Ростов-на-Дону

Re: GetShortPathNameA не работает в WinXP SP3!

Сообщение Alec » 12.08.2011 (Пт) 17:00

Так ведь там так и пишут:
If a folder/file already has a short name, for example "Program Files", then it will return the short name for that folder/file. But if a short name doesn't exist, you will instead get the long name for the file as it is the only name that exists for that object. If short names are disabled then there is no short name to get.
Иногда лучше вовремя остановиться...
И начать заново!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: GetShortPathNameA не работает в WinXP SP3!

Сообщение iGrok » 12.08.2011 (Пт) 18:42

Потому, что в sp3 фича, о которой выше неоднократно писали, по умолчанию включена. Ты это проверил, или нет?
label:
cli
jmp label


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 7

    TopList