Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetShortPathName, некорректно работает 
V
    Опции темы
Sergio
  Дата 14.9.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Привет. Не работает функция:
Код

    long     length = 0;
    LPWSTR   buffer = NULL;

    length = GetShortPathName((LPCWSTR)"C:\\test.txt", buffer, 255);

Возращает ноль и не записывает краткое имя в переменную. 
Помогите решить проблему.
Спасибо.
PM MAIL ICQ   Вверх
GremlinProg
Дата 14.9.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



юникод версия требует и юникод строки
GetShortPathName(L"C:\\test.txt",...);


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
586
Дата 14.9.2008, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



ужас...

Код
TCHAR buf[MAX_PATH];
DWORD length;

length = GetShortPathName(_T("C:\\test.txt"), buf, sizeof(buf) / sizeof(TCHAR));

PM   Вверх
Sergio
Дата 14.9.2008, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



586, возращает мне C:\\test.txt Мне нужно чтобы возратило только имя: test.txt
Возможно я не ту функцию использую?
PM MAIL ICQ   Вверх
586
Дата 14.9.2008, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Знаю несколько способов:
1. Использовать функцию PathFindFileName.
2. Если первый способ не подходит (не хочешь подключать shlwapi.dll), можно написать собственную функцию получения имени из пути, используя функцию strrchr.
Код
#include <windows.h>
#include <tchar.h>

void ExtractFileName(LPCTSTR src, LPTSTR dst, UINT cnt)
{
    LPCTSTR a = _tcsrchr(src, _T('\\'));
    LPCTSTR b = _tcsrchr(src, _T('/'));

    if((a == 0) && (b == 0))
    {
        a = src;
    } else {
        if (a < b) a = b;
        ++a;
    }

    _tcsncpy(dst, a, cnt);
    dst[cnt-1] = 0;
}

3. Использовать функцию _splitpath из стандартной библиотеки Си.

Это сообщение отредактировал(а) 586 - 15.9.2008, 12:11
PM   Вверх
Sergio
Дата 15.9.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



586, спасибо за реализацию на С но:
Код

    LPTSTR dst;
    ExtractFileName(LPCTSTR("C:\\test.exe"), dst, 10);    

Я вроде бы правильно вызываю но возращает плохой указатель на dst(
Должно бы в dst возратить:
Цитата

test.exe


Это сообщение отредактировал(а) Sergio - 15.9.2008, 12:54
PM MAIL ICQ   Вверх
dumb
Дата 15.9.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(Sergio @  15.9.2008,  13:52 Найти цитируемый пост)
Я вроде бы правильно вызываю
smile
Код
TCHAR buf[MAX_PATH];
ExtractFileName(_T("C:\\test.exe"), buf, sizeof(buf)/sizeof(TCHAR));


Добавлено через 52 секунды
таки стОит почитать какой-нибудь букварь по C/C++
PM MAIL   Вверх
Sergio
Дата 15.9.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Спасибо, почитаю  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.