Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разименовывание ярлыков(*.lnk) Ссылка на файл или объект?

1.9K
21 октября 2007 года
max_dark
256 / / 11.11.2005
[Язык C++]
Наскрябал я по разным источникам функцию ResolveLink(здесь приводить не буду - довольно объемная, см вложение)
Все бы хорошо - получаем путь к файлу, рабочую директорию и т.д., но портит все то, что в ярлыке может быть ссылка на объект(ярлык для принтера, например) :mad:
Как определить - ярлык на файл или объект?

Пытался определить по количеству "Item Identifiers", возвращаемое IShellLink::GetIDList
Для большинства ярлыков на файл оно равно 4
Тестировал в WinXP, как в других - не знаю :confused:
14
28 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Так как автор активен, отвечу:
количество итемов в PIDL-е не есть хороший способ, поскольку оно ни о чем не говорит и, как правило, зависит от вложенности файла.
Наскоряк могу предложить протестировать возвращаемое функцией SHGetPathFromIDList(), примененной над IShellLink::GetIDList, значение на False
1.9K
29 июля 2008 года
max_dark
256 / / 11.11.2005
Phodopus, спасибо.
К сожалению, сейчас опробовать не могу - я не дома, а на ноутбуке стоит FreeBSD. Как вернусь, обязательно отпишу результаты
1.9K
23 августа 2008 года
max_dark
256 / / 11.11.2005
Phodopus, спасибо за функцию. То что нужно.
Только есть одно "но": на некоторых ярлыках(пример: ярлык для Word 2003) она возвращает не тот файл, что открывается при щелчке на этом ярлыке.
Сейчас я использую следующий код(полный вариант во вложении):
Код:
bool ResolveLink(TAbstractWindow *wnd,LPCTSTR path,settings &set) {
    bool result=false;
    IShellLink* lnk=NULL;
    if  (SUCCEEDED(
            CoCreateInstance(CLSID_ShellLink, NULL,
                CLSCTX_INPROC_SERVER, IID_IShellLink,(void**)&lnk
        ))) {
        IPersistFile* lfile=NULL;
        if  (SUCCEEDED(
                lnk->QueryInterface(IID_IPersistFile,(void**)&lfile)
            )) {
            if  (SUCCEEDED(
                    lfile->Load(path,STGM_READ)
                )) {
                if  (SUCCEEDED(
                        lnk->Resolve(wnd->Handle(), SLR_ANY_MATCH)
                    )) {
                    TCHAR tmp[MAX_PATH];
                    int len=0;
                    LPITEMIDLIST lpiil=NULL;
                    if  (SUCCEEDED(
                            lnk->GetIDList(&lpiil)
                        )) {
                        if (SHGetPathFromIDList(lpiil, tmp)) {
                            if(len=lstrlen(tmp)) {
                                set.command=new TCHAR[len+1];
                                lstrcpy(set.command,tmp);
                            }
                            /*
                            .....
                            */
                            result=true;
                        }
                    }
                }
            }
            lfile->Release();
        }
        lnk->Release();
    }
    return result;
}
Что я упустил из виду?
14
25 августа 2008 года
Phodopus
3.3K / / 19.06.2008
Помню что у офиса ярлыки были "не как у простых людей" :). Возможно на виртуальные объекты неймспейса.. На работе ворда нет :( так что если не забуду гляну дома, отпишусь

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог