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;
}
Разименовывание ярлыков(*.lnk) Ссылка на файл или объект?
Наскрябал я по разным источникам функцию ResolveLink(здесь приводить не буду - довольно объемная, см вложение)
Все бы хорошо - получаем путь к файлу, рабочую директорию и т.д., но портит все то, что в ярлыке может быть ссылка на объект(ярлык для принтера, например) :mad:
Как определить - ярлык на файл или объект?
Пытался определить по количеству "Item Identifiers", возвращаемое IShellLink::GetIDList
Для большинства ярлыков на файл оно равно 4
Тестировал в WinXP, как в других - не знаю :confused:
количество итемов в PIDL-е не есть хороший способ, поскольку оно ни о чем не говорит и, как правило, зависит от вложенности файла.
Наскоряк могу предложить протестировать возвращаемое функцией SHGetPathFromIDList(), примененной над IShellLink::GetIDList, значение на False
К сожалению, сейчас опробовать не могу - я не дома, а на ноутбуке стоит FreeBSD. Как вернусь, обязательно отпишу результаты
Только есть одно "но": на некоторых ярлыках(пример: ярлык для Word 2003) она возвращает не тот файл, что открывается при щелчке на этом ярлыке.
Сейчас я использую следующий код(полный вариант во вложении):
Код:
Помню что у офиса ярлыки были "не как у простых людей" :). Возможно на виртуальные объекты неймспейса.. На работе ворда нет :( так что если не забуду гляну дома, отпишусь