![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ярлычек [D7, WinXP]
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]И так тоже не работает. Вообще.