Как запустить ярлык (.lnk)??
От: Deus  
Дата: 02.07.03 13:43
Оценка:
Сабж.
Вытащить из ярлыка путь к файлу и запустить — не катит.
ShellExecute возвращает ERROR_FILE_NOT_FOUND, ERROR_GEN_FAILURE
Re: Как запустить ярлык (.lnk)??
От: IstrAlien Россия  
Дата: 02.07.03 14:12
Оценка:
Здравствуйте, Deus, Вы писали:

D>Вытащить из ярлыка путь к файлу и запустить — не катит.

D>ShellExecute возвращает ERROR_FILE_NOT_FOUND, ERROR_GEN_FAILURE
WinExec ("start mylink.lnk", SW_SHOW);
... << RSDN@Home 1.1 beta 1 >>
Re: Как запустить ярлык (.lnk)??
От: ilya123 Россия  
Дата: 02.07.03 14:18
Оценка:
Здравствуйте, Deus, Вы писали:

D>Вытащить из ярлыка путь к файлу и запустить — не катит.

D>ShellExecute возвращает ERROR_FILE_NOT_FOUND, ERROR_GEN_FAILURE


HINSTANCE hI = ::ShellExecute(0, _T("open"), sLnkPath, 0, 0, SW_SHOWNORMAL);
ASSERT( (int)hI>32 );


или


HINSTANCE hI = ::ShellExecute(0, 0, sLnkPath, 0, 0, SW_SHOWNORMAL);



Полный путь указываешь?
Попробуй другой lnk запустить.
Re: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 02.07.03 16:10
Оценка:
2IstrAlien:
WinExec ('start X:\Far\far.lnk',SW_SHOW);
ERROR_FILE_NOT_FOUND
WinExec ('X:\Far\far.lnk',SW_SHOW);
ERROR_BAD_FORMAT

2ilya123:
ShellExecute возвращает ERROR_GEN_FAILURE


Ярлык существует, работает — если в том же Фаре выполнить — открывает без проблем.

Re[2]: Как запустить ярлык (.lnk)??
От: IstrAlien Россия  
Дата: 02.07.03 20:29
Оценка:
Здравствуйте, Deus, Вы писали:

D>WinExec ('start X:\Far\far.lnk',SW_SHOW);

D>ERROR_FILE_NOT_FOUND
хм... у тебя start.exe вообще видит?

D>WinExec ('X:\Far\far.lnk',SW_SHOW);

D>ERROR_BAD_FORMAT
а так и не должно работать

D>Ярлык существует, работает — если в том же Фаре выполнить — открывает без проблем.


очень странно, проверял и в Borland C++ 5.5 и в Delphi 6.0: все работает на ура.


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormActivate(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation
procedure TForm1.FormActivate(Sender: TObject);
begin
  WinExec ('start "c:\matlab6p5\matlab 6.5.lnk"', SW_SHOW);
end;

end.



#include <windows.h>
void main(){
    WinExec ("start \"matlab 6.5.lnk\"", SW_SHOW);
}
... << RSDN@Home 1.1 beta 1 >>
Re[2]: Как запустить ярлык (.lnk)??
От: Apapa Россия  
Дата: 03.07.03 05:49
Оценка:
Здравствуйте, Deus, Вы писали:

D>WinExec ('start X:\Far\far.lnk',SW_SHOW);

D>ERROR_FILE_NOT_FOUND
D>WinExec ('X:\Far\far.lnk',SW_SHOW);
D>ERROR_BAD_FORMAT

А ты на чем писал эти строки?


Здесь могла бы быть Ваша реклама!
Re[3]: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 03.07.03 18:48
Оценка:
Здравствуйте, IstrAlien, Вы писали:

D>>WinExec ('start X:\Far\far.lnk',SW_SHOW);

D>>ERROR_FILE_NOT_FOUND
IA>хм... у тебя start.exe вообще видит?
Ниа. У меня XP, но эта фигня не видится.
К тому же мне нужен метод, работающий на всех линейках виндоус....

D>>WinExec ('X:\Far\far.lnk',SW_SHOW);

D>>ERROR_BAD_FORMAT
IA>а так и не должно работать
Вот и я так думаю

D>>Ярлык существует, работает — если в том же Фаре выполнить — открывает без проблем.


IA>очень странно, проверял и в Borland C++ 5.5 и в Delphi 6.0: все работает на ура.

Радует, но мне нужен способ без start.exe...
Re[3]: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 03.07.03 18:51
Оценка:
Здравствуйте, Apapa, Вы писали:

A>Здравствуйте, Deus, Вы писали:


D>>WinExec ('start X:\Far\far.lnk',SW_SHOW);

D>>ERROR_FILE_NOT_FOUND
D>>WinExec ('X:\Far\far.lnk',SW_SHOW);
D>>ERROR_BAD_FORMAT

A>А ты на чем писал эти строки?

Delphi 5
Это имеет значение?
Re: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 03.07.03 19:39
Оценка:
Здравствуйте, Deus, Вы писали:

D>Сабж.

D>Вытащить из ярлыка путь к файлу и запустить — не катит.
D>ShellExecute возвращает ERROR_FILE_NOT_FOUND, ERROR_GEN_FAILURE
Дополнение:
ShellExecuteEx
возвращает 0, но при этом показывается окошко 'Windows cannon open this file'
и предложение выбрать программу, которая должна открывать .lnk
Re[2]: Как запустить ярлык (.lnk)??
От: SergH Россия  
Дата: 04.07.03 01:54
Оценка:
Здравствуйте, Deus, Вы писали:

D>Дополнение:

D>ShellExecuteEx
D>возвращает 0, но при этом показывается окошко 'Windows cannon open this file'
D>и предложение выбрать программу, которая должна открывать .lnk
D>

Если ничего не помогает — есть радикальный метод. Подменить dll (или как угодно иначе перехватить функции) и выяснить, что и с какими параметрами вызывает Far. Если выяснишь — напиши в форум, интерестно.
Делай что должно, и будь что будет
Re: Как запустить ярлык (.lnk)??
От: Apapa Россия  
Дата: 04.07.03 06:03
Оценка:
Здравствуйте, Deus, Вы писали:

D>Сабж.

D>Вытащить из ярлыка путь к файлу и запустить — не катит.
D>ShellExecute возвращает ERROR_FILE_NOT_FOUND, ERROR_GEN_FAILURE

Следующий код проверил на Win98, Win2000, WinXP
ShellExecute(0, 'open', 'X:\Users\Bag\VadimCh\Far.lnk', '', '', SW_SHOW);


Все прекрасно работает!


Здесь могла бы быть Ваша реклама!
Re[3]: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 04.07.03 12:28
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Deus, Вы писали:


D>>Дополнение:

D>>ShellExecuteEx
D>>возвращает 0, но при этом показывается окошко 'Windows cannon open this file'
D>>и предложение выбрать программу, которая должна открывать .lnk
D>>

SH>Если ничего не помогает — есть радикальный метод. Подменить dll (или как угодно иначе перехватить функции) и выяснить, что и с какими параметрами вызывает Far. Если выяснишь — напиши в форум, интерестно.


Будешь смеятся, но я это уже сделал
Тока не помогает.
Фар делает кучу различных телодвижений, по всякому пристраивается к этому несчастному ярлыку, лазит в реестр, но команды на запуск у меня не отловилось...

Так же я залез в потроха эксплорера, но там вообще глухо...
Re[2]: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 04.07.03 12:30
Оценка:
Здравствуйте, Apapa, Вы писали:

A>Здравствуйте, Deus, Вы писали:


D>>Сабж.

D>>Вытащить из ярлыка путь к файлу и запустить — не катит.
D>>ShellExecute возвращает ERROR_FILE_NOT_FOUND, ERROR_GEN_FAILURE

A>Следующий код проверил на Win98, Win2000, WinXP

A>
A>ShellExecute(0, 'open', 'X:\Users\Bag\VadimCh\Far.lnk', '', '', SW_SHOW);
A>


A>Все прекрасно работает!


Я делал ShellExecute(0,nil,PChar(EditBox1.Text),nil,nil,sw_shownormal); на 4 машинах — везде XP.
Так вот, на 2 из них запуск не происходит, возвращается 31(ERROR_GEN_FAILURE), на остальных 2 — запускается без проблем.
Re[4]: Как запустить ярлык (.lnk)??
От: SergH Россия  
Дата: 04.07.03 12:41
Оценка:
Здравствуйте, Deus, Вы писали:

D>Будешь смеятся, но я это уже сделал

D>Тока не помогает.
D>Фар делает кучу различных телодвижений, по всякому пристраивается к этому несчастному ярлыку, лазит в реестр, но команды на запуск у меня не отловилось...

D>Так же я залез в потроха эксплорера, но там вообще глухо...


Не, либо ты не понял что я советовал, либо я не понял, что ты сделал. Я имел ввиду перехватить CreateProcessA/W, ShellExecute[Ex]A/W, WinExecA/W + может ещё что-то и выводить в файл параметры с которыми они вызываются Фаром или Эксплорером. Я так делал в подобной ситуации (есть программа, которая ДЕЛАЕТ, а моя, такая же — как об стену лбом..) — помогло.

Кстати, через COM никак ярлыки нельзя запускать? Был же интерфейс IShellLink, если не ошибаюсь..
Делай что должно, и будь что будет
Re[3]: Как запустить ярлык (.lnk)??
От: Apapa Россия  
Дата: 04.07.03 12:47
Оценка:
Здравствуйте, Deus, Вы писали:

A>>Следующий код проверил на Win98, Win2000, WinXP

A>>
A>>ShellExecute(0, 'open', 'X:\Users\Bag\VadimCh\Far.lnk', '', '', SW_SHOW);
A>>


A>>Все прекрасно работает!


D>Я делал ShellExecute(0,nil,PChar(EditBox1.Text),nil,nil,sw_shownormal); на 4 машинах — везде XP.


Может быть стоит поставить второй параметр как 'open'?


Здесь могла бы быть Ваша реклама!
Re[4]: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 04.07.03 12:52
Оценка:
Здравствуйте, Apapa, Вы писали:

A>Здравствуйте, Deus, Вы писали:


A>>>Следующий код проверил на Win98, Win2000, WinXP

A>>>
A>>>ShellExecute(0, 'open', 'X:\Users\Bag\VadimCh\Far.lnk', '', '', SW_SHOW);
A>>>


A>>>Все прекрасно работает!


D>>Я делал ShellExecute(0,nil,PChar(EditBox1.Text),nil,nil,sw_shownormal); на 4 машинах — везде XP.


A>Может быть стоит поставить второй параметр как 'open'?

Ставил, тажа фигня.
Re[5]: Как запустить ярлык (.lnk)??
От: Deus  
Дата: 04.07.03 13:40
Оценка:
Здравствуйте, SergH, Вы писали:

SH>Здравствуйте, Deus, Вы писали:


D>>Будешь смеятся, но я это уже сделал

D>>Тока не помогает.
D>>Фар делает кучу различных телодвижений, по всякому пристраивается к этому несчастному ярлыку, лазит в реестр, но команды на запуск у меня не отловилось...

D>>Так же я залез в потроха эксплорера, но там вообще глухо...


SH>Не, либо ты не понял что я советовал, либо я не понял, что ты сделал. Я имел ввиду перехватить CreateProcessA/W, ShellExecute[Ex]A/W, WinExecA/W + может ещё что-то и выводить в файл параметры с которыми они вызываются Фаром или Эксплорером. Я так делал в подобной ситуации (есть программа, которая ДЕЛАЕТ, а моя, такая же — как об стену лбом..) — помогло.


Второе
Я юзаю ApiSpy32 by Matt Pietrek.
Когда я натравливаю его на фар и открываю этот lnk, то вижу, что фар делает кучу телодвижений типа:
GetFileAttributesA(LPSTR:0012AFC0:"far.lnk")
GetFileAttributesA returns: 20
CreateFileA(LPSTR:0012AFC0:"far.lnk",DWORD:80000000,DWORD:00000003,LPDATA:0012AB9C,DWORD:00000003,DWORD:00000020,HANDLE:00000000)
CreateFileA returns: 68
GetFileType(HANDLE:00000068)
GetFileType returns: 1
...
OemToCharA(LPSTR:0012AFC0:"far.lnk",LPSTR:00126AB8:"")
OemToCharA returns: 1
...
RegQueryValueA(HANDLE:80000000,LPSTR:00129221:".lnk",LPSTR:00127A64:"рЭ",LPDATA:00127AB8)
RegQueryValueA returns: 0
RegOpenKeyA(HANDLE:80000000,LPSTR:00127A64:"lnkfile\sh",LPDATA:00127AB4)
RegOpenKeyA returns: 2
...
SetFileApisToOEM()
SetFileApisToOEM returns: 77F5B9BF
...
GetTickCount()
GetTickCount returns: 2FCD34
GetConsoleScreenBufferInfo(HANDLE:0000000F,LPDATA:00127AAC)
GetConsoleScreenBufferInfo returns: 1

а потом сразу
GetExitCodeProcess(HANDLE:00000000,LPDATA:00129DDC)
GetExitCodeProcess returns: 0


SH>Кстати, через COM никак ярлыки нельзя запускать? Был же интерфейс IShellLink, если не ошибаюсь..

Почему был? Он и щас есть...
IShellLink supports the following methods:

GetArguments Retrieves the command-line arguments associated with a shell link object.
GetDescription Retrieves the description string for a shell link object.
GetHotkey Retrieves the hot key for a shell link object.
GetIconLocation Retrieves the location (path and index) of the icon for a shell link object.
GetIDList Retrieves the list of item identifiers for a shell link object.
GetPath Retrieves the path and file name of a shell link object.
GetShowCmd Retrieves the show (SW_) command for a shell link object.
GetWorkingDirectory Retrieves the name of the working directory for a shell link object.
Resolve Resolves a shell link by searching for the shell link object and updating the shell link path and its list of identifiers (if necessary).
SetArguments Sets the command-line arguments associated with a shell link object.
SetDescription Sets the description string for a shell link object.
SetHotkey Sets the hot key for a shell link object.
SetIconLocation Sets the location (path and index) of the icon for a shell link object.
SetIDList Sets the list of item identifiers for a shell link object.
SetPath Sets the path and file name of a shell link object.
SetRelativePath Sets the relative path for a shell link object.
SetShowCmd Sets the show (SW_) command for a shell link object.
SetWorkingDirectory Sets the name of the working directory for a shell link object.

Можно конечно вытащить из ярлыка название файла и запускать вручную, но это не подходит, ибо в ярлыке лежит куча вещей типа шрифта для консоли, параметров совместимости, etc...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.