Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ярлычек [D7, WinXP]


Страницы:   1 2

Vaitek ©   (2004-12-31 13:14:00) 

Глупый вопрос про то как запустить ярлык *.lnk
Делаю так:
ShellExecute(Handle,'open','explorer','C:\mylink.lnk',nil,SW_NORMAL);

Ярлык запускается, но Explorer выдает окошко, в котором спрашивает, что сделать с объектом - открыть или сохранить. Честно говоря надоело какждый раз нажимать "Open". Может есть какой альтарнативный способ запуска?


VMcL   (2005-01-03 11:57:00) [1]

>> Cobalt ©  (02.01.05 01:15) [22]

Сделал тестовое VPN-соединение (на 127.0.0.1:). Проверил. Работает  (открывается окно для ввода логина/пароля). Win2K, SP4.

procedure TForm1.Button1Click(Sender: TObject);
begin
  if ShellExecute(Handle, nil, 'C:\_VPN Test.lnk', nil, nil, SW_SHOW) <= HINSTANCE_ERROR then
     RaiseLastOSError;
end;


Cobalt   (2005-01-02 01:15:00) [2]

2 VMcL ©   (01.01.05 06:53) [20]
У меня такой код не возвращает ошибки, но и ничего не открывается.
Ярлык - на VPN-соединение.
WinXP SP2.


Vaitek   (2005-01-01 11:58:00) [3]

И интересно, где глюк? В 2003 SP1 винде или 2005 Delphi? Потому как где кривизна в моих руках я понять не могу.


VMcL   (2005-01-01 06:53:00) [4]

> ShellExecute(Handle, nil, 'C:\mylink.lnk', nil, nil, SW_SHOW);

У меня так работает. В качестве C:\mylink.lnk использовалась ссылкана сетевое соединение. Пробовал два разных соединения: ADSL и dial-up.


Vaitek   (2005-01-01 00:14:00) [5]

Ну, на самом деле, получетсся код 0 - оперция завершена успешно... И Hinst - 42, что больше 32, а занчит не ошибка... Но вот только ничего не запускается. Все равно. Новогодние глюки блин.


GuAV   (2004-12-31 22:09:00) [6]

таки как насчёт
ShellExecute(Handle,nil,'C:\mylink.lnk',nil,nil,SW_SHOW);
Caption := Format('Error #%d - %s',
[GetLastError, SysErrorMessage(GetLastError)]);


Vaitek   (2004-12-31 22:01:00) [7]

О чем я и говорил, когда писал, что
"Да там не файл, там ссылка на dialup соединение."


jack128   (2004-12-31 19:01:00) [8]

а, стоп. Если это линк НЕ на файл или папку, то естественно ничего не будет работать..


jack128   (2004-12-31 18:58:00) [9]

нужно подлючить модуль ComObj или вручную инициализировать СОМ...


Vaitek   (2004-12-31 18:32:00) [10]

перепроверил. вызываю так:

ShellExecute(Handle,'open',PChar(ExtractPathFromLink('C:\INET.lnk')),nil,nil,SW_SHOW);

Получаю сообщение об ошибке. Не срабатывает первое условие. То, которое:  
(CoCreateInstance(CLSID_ShellLink, nil,
CLSCTX_INPROC_SERVER, IShellLinkA, intf) = 0)


Vaitek   (2004-12-31 18:32:00) [11]

перепроверил. вызываю так:

ShellExecute(Handle,'open',PChar(ExtractPathFromLink('C:\INET.lnk')),nil,nil,SW_SHOW);

Получаю сообщение об ошибке. Не срабатывает первое условие. То, которое:  
(CoCreateInstance(CLSID_ShellLink, nil,
CLSCTX_INPROC_SERVER, IShellLinkA, intf) = 0)


jack128   (2004-12-31 18:26:00) [12]

но вообще то что странное происходит.. Вот сейчас снова проверил код ГуАВ - нет ошибок. Диал ап не проверял, но впн соединение вполне запускается..Мдя. "Россия - не Украина" (c) Я. :-)


GuAV   (2004-12-31 18:18:00) [13]

Ещё раз проверил с dial-up соединением - мой код работает.

[7] ?


Vaitek   (2004-12-31 18:05:00) [14]

Да там не файл, там ссылка на dialup соединение.


jack128   (2004-12-31 17:58:00) [15]

Можно вытянуть из ярлыка имя файла на который он ссылатся и запускать сам этот файл..

function ExtractPathFromLink(LinkFileName: string): string;
var
 Link: IShellLinkA;
 File_: IPersistFile;
 intf: IUnknown;
 ffd: TWin32FindData;
begin
 if (CoCreateInstance(CLSID_ShellLink, nil,
           CLSCTX_INPROC_SERVER, IShellLinkA, intf) = 0) and
   (intf.QueryInterface(IShellLinkA, Link) = 0) and
   (Link.QueryInterface(IPersistFile, File_) = 0) and
   (File_.Load(PWideChar(WideString(LinkFileName)), STGM_READ) = 0) then
 begin
   SetLength(Result, 255);
   if Link.GetPath(PChar(Result), 255, ffd, SLGP_UNCPRIORITY) = 0 then
   begin
     SetLength(Result, StrLen(PChar(Result)));
     Exit;
   end;
 end;
 raise Exception.Create('Ошибка');
end;


Vaitek   (2004-12-31 17:11:00) [16]

handle он нужен. Ексепшенов нет, ничего давить не приходится, просто тихо возвращается код какой-то ошибки, и все.

Но, гордо крикнув "Мы пойдем другим путем!" я написал такой код,
который сам нажимает на кнопочку "Открыть". 8-) Всо нормально, хотя если кто знает ак обойтись без этого гемора - жду ответа.

     c := FindWindow(nil,'File Download - Security Warning');
     If c <> 0 then
     Begin
       c := GetWindow(c,GW_CHILD);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       c := GetWindow(c,GW_HWNDNEXT);
       SendMessage(c,BM_Click,0,0);
     End


GuAV   (2004-12-31 17:09:00) [17]

2 Vaitek ©

Caption := Format('Error #%d - %s',
 [GetLastError, SysErrorMessage(GetLastError)]);

что скажет ?


GuAV   (2004-12-31 16:57:00) [18]

jack128 ©   (31.12.04 16:51) [5]

У меня ничего подобного не выдаёт.
"Украина - не Россия"© :-)


jack128   (2004-12-31 16:51:00) [19]

у меня например и вариант Gero, и вариант GuAV выдают EExternalException с кодом ошибки STATUS_INVALID_HANDLE. Но программа при этом запускается. Так что в принципе можно это исключение глушить..Правда непонятно причем здесь хендл...


Vaitek   (2004-12-31 16:33:00) [20]

И так тоже не работает. Вообще.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо