Содержимое ярлыка

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Содержимое ярлыка

Сообщение Vitaly1 » 14.02.2004 (Сб) 11:37

Я определяю содержимое ярлыка так:

Код: Выделить всё
Function danShurtCut(Name)
'Расшифровка ярлыка
Form1.CommonDialog1.Filename = Name
Form1.CommonDialog1.filter ="*.*"+chr(124)+"*.*"
[b]'извиняюсь , если неправильно написал по памяти имя свойства[/b]
Form1.CommonDialog1.dialogtitle ="Ярлык на папку"
SendKeys Chr(13)
Form1.CommonDialog1.ShowOpen
danShurtCut = CommonForm1.Dialog1.Filename
End Function



Функция выдает либо путь к файлу сразу, либо путь к выбранному файлу(если ярлык на папку), либо полное имя ярлыка, если файл не выбран(и ярлык на папку)

Это, конечно, криво, как иначе определить содержимое ярлыка?

young
Обычный пользователь
Обычный пользователь
 
Сообщения: 95
Зарегистрирован: 19.06.2003 (Чт) 15:12
Откуда: Липецк

Сообщение young » 14.02.2004 (Сб) 12:25

Vitaly1 Собственно говоря, в мозгах фактически тоже самое - считывать посторчно, пока не поподёт путь.... (искать по маске)

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 17.02.2004 (Вт) 13:02

Господа программисты, неужели никто не знает как посмотреть содержимое ярлыка не пользуясь объектом CommonDialog? :?: :cry:

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.02.2004 (Вт) 16:17

Смотри аттач.
Там пример работы с ярлыками (через TLB). Если не устраивает таскать с собой TLB-файл, то можешь загрузить его в ресурсы и подключать при запуске программы (примеры были в MSDN, точный адрес не помню).
Для партизанов в аттаче также есть описание структуры файла-ярлыка (правда устаревшее), можешь написать свой парсер.

Блин, не могу закачать. Смотри на http://alibek7.narod.ru/shortcut.zip
Lasciate ogni speranza, voi ch'entrate.

Krasavica
Небожительница
Небожительница
Аватара пользователя
 
Сообщения: 1378
Зарегистрирован: 04.11.2003 (Вт) 17:51
Откуда: Россия, город-герой Москва ;-)

Сообщение Krasavica » 18.02.2004 (Ср) 2:42

Vitaly1
Можно.
Вот я на Delphi писала как-то.


Код: Выделить всё
// Обновление ярлыка для файла  (запабликить)
function EditLink(LinkFileName:String; var Buff, Arg, Dir: string):boolean;
var
MyObject: IUnknown;
MySLink: IShellLink;
MyPFile: IPersistFile;
FileInfo: TWin32FINDDATA;
WidePath: array [0..MAX_PATH] of WideChar;
bBuff, bArg, bDir: array [0..MAX_PATH] of Char;
begin
Result := False;
if not fileexists(Linkfilename) then exit;
MyObject := CreateComObject(CLSID_ShellLink);
MyPFile := MyObject as IPersistFile;
MySLink := MyObject as IShellLink;
StringToWideChar(LinkFileName, WidePath, SizeOf(WidePath));
MyPFile.Load(WidePath, STGM_READ);
MySLink.GetPath(bBuff, Max_PATH, FileInfo, SLGP_UNCPRIORITY);
MySLink.GetArguments(bArg,MAX_PATH);
MySLink.GetWorkingDirectory(bDir, MAX_PATH);
Buff:=bBuff;
Arg:=bArg;
Dir:=bDir;
// MySLink.Get
Result := True;
end;

:)

А MSDN говорит следующее:


Код: Выделить всё
HRESULT ResolveIt(HWND hwnd, LPCSTR lpszLinkFile, LPSTR lpszPath)
{
    HRESULT hres;
    IShellLink* psl;
    char szGotPath[MAX_PATH];
    char szDescription[MAX_PATH];
    WIN32_FIND_DATA wfd;

    *lpszPath = 0; // assume failure

    // Get a pointer to the IShellLink interface.
    hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
                            IID_IShellLink, (LPVOID*)&psl);
    if (SUCCEEDED(hres))
    {
        IPersistFile* ppf;

        // Get a pointer to the IPersistFile interface.
        hres = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
 
        if (SUCCEEDED(hres))
        {
            WCHAR wsz[MAX_PATH];

            // Ensure that the string is Unicode.
            MultiByteToWideChar(CP_ACP, 0, lpszLinkFile, -1, wsz, MAX_PATH);

            // TODO: Check return value from MultiByteWideChar to ensure
                     success.

            // Load the shortcut.
            hres = ppf->Load(wsz, STGM_READ);
           
            if (SUCCEEDED(hres))
            {
                // Resolve the link.
                hres = psl->Resolve(hwnd, 0);

                if (SUCCEEDED(hres))
                {
                    // Get the path to the link target.
                    hres = psl->GetPath(szGotPath,
                                        MAX_PATH,
                                        (WIN32_FIND_DATA*)&wfd,
                                        SLGP_SHORTPATH);

                    if (SUCCEEDED(hres))
                    {
                        // Get the description of the target.
                        hres = psl->GetDescription(szDescription, MAX_PATH);

                        if (SUCCEEDED(hres))
                        {
                            hres = StringCbCopy(lpszPath, sizeof(lpszPath),
                                                szGotPath);
                            if (SUCCEEDED(hres))
                            {
                                // Handle success
                            }
                            else
                                // application-defined function
                                HandleErr(hres);
                        }
                    }
                }
            }

            // Release the pointer to the IPersistFile interface.
            ppf->Release();
        }

        // Release the pointer to the IShellLink interface.
        psl->Release();
    }
    return hres;
}



:wink:
я - ангел!!! ...просто крылья в стирке, а нимб на подзарядке!
Меня трудно найти, легко потерять и невозможно забыть.Изображение

<Sergey>
Начинающий
Начинающий
 
Сообщения: 16
Зарегистрирован: 08.02.2004 (Вс) 3:25
Откуда: Одесса

Сообщение <Sergey> » 18.02.2004 (Ср) 3:54

Подключи библиотеку Microsoft Shell Controls And Automation, она содержит объект ShellLinkObject. Используя свойства этого объекта можно задать все параметры ярлыка.
Только есть один ньюанс - в W-98 я не смог заставить его работать (не помню почему - давно я с этим стокнулся). В XP проблем не было.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 18.02.2004 (Ср) 13:50

Всем спасибо, особенно Красавице, будем пробовать и пытаться перевести с одного программного языка на другой.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 18.02.2004 (Ср) 15:34

Не сможешь, VB не работает с интерфейсами.
Либо пиши библиотеку на Delphi или на C (или используй какую-нибудь готовую) и подключай к проекту, либо пиши свой парсер.
Lasciate ogni speranza, voi ch'entrate.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 18.02.2004 (Ср) 18:31

Очень жаль, что нельзя просто перевест. :cry:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 20.02.2004 (Пт) 12:18

Даже если в MSDN не написано то, что мы хотим там видеть, то ничто не мешает нам сделать смелое предположение... :) И потом страшно обломаться! :twisted: Но не в данном случае 8)
Код: Выделить всё
Option Explicit
       
Private Sub Form_Load()
  Dim a As Object, link As Object
 
  Set a = CreateObject("WScript.Shell")
  Set link = a.createshortcut("c:\1.lnk")
  MsgBox link.targetpath
  Set link = Nothing
  Set a = Nothing
End Sub


За остальными методами сюда.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Krasavica
Небожительница
Небожительница
Аватара пользователя
 
Сообщения: 1378
Зарегистрирован: 04.11.2003 (Вт) 17:51
Откуда: Россия, город-герой Москва ;-)

Сообщение Krasavica » 22.02.2004 (Вс) 23:27

Vitaly1
Вот нашла для вас более удобный, найденный на одном из ресурсов по кодингу на VB, способ:

Dim myFSO As Object
Dim myFL, a, b, c, d, e, f
Set myFSO = CreateObject("WScript.Shell")
Set myFL = myFSO.CreateShortCut("Полный путь к ярлыку.lnk")
a = "Путь к родительскому объекту: " & myFL.TargetPath & vbCrLf
b = "Горячая клавиша: " & myFL.Hotkey & vbCrLf
c = "WindowStyle: " & myFL.WindowStyle & vbCrLf
d = "№Иконки в род. файле: " & myFL.IconLocation & vbCrLf
e = "Комментарий иконки: " & myFL.Description & vbCrLf
f = "Рабочая папка род. объ.: " & myFL.WorkingDirectory

Set myFSO = Nothing
Set myFL = Nothing
MsgBox a & b & c & d & e & f

:wink:
я - ангел!!! ...просто крылья в стирке, а нимб на подзарядке!
Меня трудно найти, легко потерять и невозможно забыть.Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.02.2004 (Пн) 12:09

Уважаемая Krasavica, а чем ваш способ отличается от того, что дал GSerg? :)
Lasciate ogni speranza, voi ch'entrate.

Krasavica
Небожительница
Небожительница
Аватара пользователя
 
Сообщения: 1378
Зарегистрирован: 04.11.2003 (Вт) 17:51
Откуда: Россия, город-герой Москва ;-)

Сообщение Krasavica » 23.02.2004 (Пн) 12:18

alibek писал(а):Уважаемая Krasavica, а чем ваш способ отличается от того, что дал GSerg? :)


Упс, прошу прощения, не посмотрела. Просто нашла и сразу выложила, сорри. :wink:
я - ангел!!! ...просто крылья в стирке, а нимб на подзарядке!
Меня трудно найти, легко потерять и невозможно забыть.Изображение

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 24.02.2004 (Вт) 13:44

GSerg -Спасибо! :) Наконец то нашлось! :D :D :D
Красавица - Ты все равно молодец, что нашла!

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 27.02.2004 (Пт) 15:53

Господа!!! Как продолжение темы, у меня схожая проблеммка.
Есть ярлык, но не на исполняемый файл, а на сетевое подключение, стороннего производителя (Спутниковый VPN законнекчивает), так вот способом описанным здесь он не показывает ни какой статистики.
Может кто в курсе как его запустить программно это соединение.
Rasdial пробывал, не соединяет просто открывает окно где уже выбранно это соединение, но нужно кликнуть ОК для подтверждения, а использовать FindWindow не очень бы хотелось.
Помогите ПЛЗ!!! Заранее благодарен.
Если руки кривые, то не надо ругать разработчиков.

Vitaly1
Брехман
Брехман
 
Сообщения: 1578
Зарегистрирован: 30.12.2002 (Пн) 16:35
Откуда: Russia, Mosсow

Сообщение Vitaly1 » 28.02.2004 (Сб) 11:02

XPraptor писал(а):не соединяет просто открывает окно где уже выбранно это соединение, но нужно кликнуть ОК для подтверждения

Но кликнуть то OK можно через SendKeys Chr(13), а выбрать кнопку OK через SendKeys "{TAB}" ?..

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 01.03.2004 (Пн) 10:25

Vitaly1:
Елы палы Vitaly1!!! Столько звездочек. а такое предлогаешь :-)))
Если руки кривые, то не надо ругать разработчиков.


Вернуться в Visual Basic 1–6

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35

    TopList  
cron