![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перевести короткий путь к файлу в длинный? [D5, D6, Win95/98]
Arhangel © (2002-05-08 13:38:00)Т.е. надо перевести, например:"C:\Мои до~1\qqqqqq~1.exe" в "C:\Мои документы\qqqqqqqqqqqqqqq.exe"
Alx2 (2002-05-13 14:15:00) [1]А, понял!
Потому-что не везде есть нужная функция :)
Alx2 (2002-05-13 14:12:00) [2]А почему так длинно-то?
Dimka Maslov (2002-05-13 13:55:00) [3]Господа!
Не забывайте что есть UBPFD, там масса полезных примеров:
http://delphibase.endimus.com/?action=viewtopic&topic=filenames
Alx2 (2002-05-13 08:03:00) [4]>DrVasko (08.05.02 18:05)
>А зачем GetFullPathName из длл вытаскивать.
Я ее не вытаскиваю :)
>Она вроде как в модуле Windows уже прописана?
Она-то прописана, а вот это - нет: (у меня D5)
@GetLongPathName := GetProcAddress(Handle, "GetLongPathNameA"
>Кроме того она только путь переводит.
Неправда. GetLongPathName имя файла тоже переводит. Проверил.
DrVasko (2002-05-08 18:05:00) [5]> Alx2
А зачем GetFullPathName из длл вытаскивать. Она вроде как в модуле Windows уже прописана?
Кроме того она только путь переводит. А для имени файла нужна FindFirstFile.
Alx2 (2002-05-08 14:29:00) [6]А вот этот пример показывает как получить полный путь к временной директории исходя из ее короткого пути :)
(Дело в том, что GetTempPath дает путь в формате 8.3)
Procedure TForm1.Button14Click(Sender: TObject);
Var
Str, Str2 : String;
pch : PChar;
GetLongPathName: Function (ShortPathName: PChar; LongPathName: PChar;
cchBuffer : Integer): Integer Stdcall;
Handle : THandle;
Begin
SetLength(Str, 256);
SetLength(Str2, 256);
GetTempPath(256, PChar(Str));
Str := PChar(Str);
ShowMessage(Str);
Handle := GetModuleHandle("kernel32.dll");
If Handle = 0 Then exit;
@GetLongPathName := GetProcAddress(Handle, "GetLongPathNameA");
If Assigned(GetLongPathName) And
(GetLongPathName(PChar(Str), PChar(Str2), 256) <> 0) Then
Str2 := PChar(Str2)
Else Str2 := "???";
ShowMessage(Str2);
End;
Alx2 (2002-05-08 14:25:00) [7]А вот теперь посмотрел и выяснил, что наврал.
Решение такое:
Procedure TForm1.Button14Click(Sender: TObject);
Var
Str2: String;
GetLongPathName: Function (ShortPathName: PChar; LongPathName: PChar;
cchBuffer : Integer): Integer Stdcall;
Handle : THandle;
Begin
SetLength(Str2, 256);
Handle := GetModuleHandle("kernel32.dll");
If Handle = 0 Then exit;
@GetLongPathName := GetProcAddress(Handle, "GetLongPathNameA");
If Assigned(GetLongPathName) And
(GetLongPathName("C:\Мои до~1\qqqqqq~1.exe" , PChar(Str2), 256) <> 0) Then
Str2 := PChar(Str2)
else Str2 := "???";
// - Результат в Str2
End;
Alx2 (2002-05-08 13:48:00) [8]Сам не смотрел, извини, но, кажется вот это должно помочь.
DWORD GetFullPathName(
LPCTSTR lpFileName, // address of name of file to find path for
DWORD nBufferLength, // size, in characters, of path buffer
LPTSTR lpBuffer, // address of path buffer
LPTSTR *lpFilePart // address of filename in path
);
Arhangel (2002-05-08 13:47:00) [9]Нашел ответ в форуме, но он немного неточный, а вот и ответ:
В реестре надо написать в разделе \command myprog.exe "%L", тогда и имя файла будет полным и путь к ниму;)