ShellExecute

ShellExecute


DmitryNekl ©   (31.03.04 12:27)

Добрый день.

Есть задача: на компакт диске записана информация в html. Нужно, чтобы при запуске компакта автоматом запускался браузер и показывал инфу. Использую ShellExecute.

Проблема: если в момент запуска компакта на экране уже есть открытые браузеры, новое окно не запускается, а информация показывается в уже имеющемся экземпляре.

Как всегда показывать информацию с компакта в новом окне?



[1] YuRock ©   (31.03.04 13:34)

Ненавижу и не использую Explorer, но можно сделать так:


ShellExecute(0, '', 'iexplore', '"E:\File.html"', '', SW_SHOWNORMAL);



[2] SeLarin ©   (31.03.04 13:51)

А лучше
ShellExecute(0,'open','"E:\File.html"','','',SW_SHOWNORMAL);
Тогда откроется файл в браузере по умолчанию.



[3] DmitryNekl ©   (31.03.04 15:15)

2 YuRock.
Вся беда в том, что черт его знает, установлен у конечного пользователя ехплорер, или че другое...

2 SeLarin.
Так, собственно, и делаю... а хочется всегда в новом окне. Может, можно как-то запустить браузер, установленный в системе по умолчанию, а потом уже запускать сам файл? Но как запустить браузер по умолчанию?



[4] VMcL ©   (31.03.04 17:38)

>>DmitryNekl ©  (31.03.04 12:27)

Может TWebBrowser спасет отца русской демократии?



[5] melnikov ivan   (01.04.04 11:18)

А не легче ли скопировать иp директории Windows файл Start.com в корень CD и в aurun.inf прописать start index.htm и не заморачиваться в Delphi



[6] Kerk ©   (01.04.04 11:24)

ShellExecute(0,'open','E:\File.html', ...



[7] nikkie ©   (01.04.04 15:30)

мне почему-то кажется, что городить программу для запуска автоматом html файла не обязательно. если написать open=index.htm, то это получится и без программы.

другое дело, если программа нужна все равно (тогда autorun здесь не причем абсолютно). проблема понятна, но способа ее решения я не знаю. была идея указать не 'open', а 'opennew' - есть такое действие в списке ассоциаций для .htm, но не заработало почему-то. а вот ICQ открывает ссылки в новом окне. как - самому интересно.



[8] Константин   (01.04.04 21:26)

Открываешь блокнот и пишешь

[Autorun]
Open=index.htm

и сохраняешь под именем Autoryn.inf. Потом ложишь в корень CD и при следующем запуске диска автоматом откроется твой файл.

З. Ы. Если написать

[Autorun]
Open=index.htm
Icon=DeadHead.ico

то в проводнике вместо диска откроется иконка, которая на этом же CD называется DeadHead.ico (череп)



[9] BorH ©   (01.04.04 22:11)

Немного не в тему, но не забудьте вместо абсолютного пути "e:/index.html" указывать относительный - "/index.html". Не у всех же Сидюк - диск "E"?

Насчет открытия ШТМЛ в новм окне. С помощью АПИ по-моему никак. Разве только поменять на время работы программы в реестре (к сожалению, не помню где), способ открытия странички...

Я пользуюсь AvantBrowser. Открывает странички в новых окнах ;))



[10] nikkie ©   (01.04.04 23:08)

>С помощью АПИ по-моему никак.
ну почему никак. например, определить дефолтный браузер, если это IE, то создать новое окно и навигировать его через OLE, иначе - ShellExecute. муторно только как-то...

>Я пользуюсь AvantBrowser. Открывает странички в новых окнах ;))
ты себе хоть сам браузер напиши. мы о юзере заботимся :)



[11] Игорь Шевченко ©   (01.04.04 23:09)


> а вот ICQ открывает ссылки в новом окне. как - самому интересно.


http://www.swissdelphicenter.ch/torry/showcode.php?id=490
uses
 ShellAPI, Registry;

procedure OpenURL(Url: string);
var
 ts: string;
begin
 with TRegistry.Create do
   try
     rootkey := HKEY_CLASSES_ROOT;
     OpenKey('\htmlfile\shell\open\command', False);
     try
       ts := ReadString('');
     except
       ts := '';
     end;
     CloseKey;
   finally
     Free;
   end;
 if ts = '' then Exit;
 // remove quotes and commandline parameters
 ts := Copy(ts, Pos('"', ts) + 1, Length(ts));
 ts := Copy(ts, 1, Pos('"', ts) - 1);
 ShellExecute(0, 'open', PChar(ts), PChar(url), nil, SW_SHOW);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 OpenURL('http://www.SwissDelphiCenter.ch');
end;



uses
 DdeMan,
{$IFDEF WIN32}
 Registry; {We will get it from the registry}
{$ELSE}
 IniFiles; {We will get it from the win.ini file}
{$ENDIF}

{$IFNDEF WIN32}
const  
 MAX_PATH = 144;
 {$ENDIF}

function GetProgramAssociation(Ext: string): string;
var
 {$IFDEF WIN32}
 reg: TRegistry;
 s: string;
 {$ELSE}
 WinIni: TIniFile;
 WinIniFileName: array[0..MAX_PATH] of Char;
 s: string;
 {$ENDIF}
begin
 {$IFDEF WIN32}
 s := '';
 reg := TRegistry.Create;
 reg.RootKey := HKEY_CLASSES_ROOT;
 if reg.OpenKey('.' + ext + '\shell\open\command',
   False) <> False then  
 begin
   {The open command has been found}
   s := reg.ReadString('');
   reg.CloseKey;
 end  
 else  
 begin
   {perhaps thier is a system file pointer}
   if reg.OpenKey('.' + ext,
     False) <> False then  
   begin
     s := reg.ReadString('');
     reg.CloseKey;
     if s <> '' then  
     begin
       {A system file pointer was found}
       if reg.OpenKey(s + '\shell\open\command',
         False) <> False then
         {The open command has been found}
         s := reg.ReadString('');
       reg.CloseKey;
     end;
   end;
 end;
 {Delete any command line, quotes and spaces}
 if Pos('%', s) > 0 then
   Delete(s, Pos('%', s), Length(s));
 if ((Length(s) > 0) and
   (s[1] = '"')) then
   Delete(s, 1, 1);
 if ((Length(s) > 0) and
   (Pos('"', s) > 0)) then
   Delete(s, Pos('"', s), Length(s));
 while ((Length(s) > 0) and
   (s[Length(s)] = #32)) do
   Delete(s, Length(s), 1);
 {$ELSE}
 GetWindowsDirectory(WinIniFileName, SizeOf(WinIniFileName));
 StrCat(WinIniFileName, '\win.ini');
 WinIni := TIniFile.Create(WinIniFileName);
 s  := WinIni.ReadString('Extensions',ext,'');
 WinIni.Free;
 {Delete any command line}
 if Pos(' ^', s) > 0 then
   Delete(s, Pos(' ^', s), Length(s));
 {$ENDIF}
 Result := s;
end;

procedure StartNewBrowserWindow(URL: string);
var
 DDEConv: TDDEClientConv;
 URLFired: bool;
 App: string;
 UpApp: string;
 p: array[0..MAX_PATH] of Char;
begin
 UrlFired := False;
 App := GetProgramAssociation('HTM');
 UpApp := Uppercase(App);
 Delete(App, Pos('.EXE', UpAPP), Length(App));
 if Pos('NETSCAPE.EXE',
   UpApp) > 0 then  
 begin
   DDEConv := TDDEClientConv.Create(nil);
   DDEConv.ServiceApplication := App;
   if DDEConv.SetLink('NETSCAPE', 'WWW_OpenURL') then
     if DDEConv.RequestData(URL + ',,0x0,0x0') <> nil then
       if DDEConv.SetLink('NETSCAPE', 'WWW_Activate') then
         URLFired := DDEConv.RequestData('0xFFFFFFFF,0x0') <> nil;
   DDEConv.Free;
 end  
 else if Pos('IEXPLORE.EXE',
   UpApp) > 0 then  
 begin
   DDEConv := TDDEClientConv.Create(nil);
   DDEConv.ServiceApplication := App;
   if DDEConv.SetLink('iexplore', 'WWW_OpenURL') then
     if DDEConv.RequestData(URL + ',,0') <> nil then
       if DDEConv.SetLink('iexplore', 'WWW_Activate') then
         URLFired := DDEConv.RequestData('0,0') <> nil;
   DDEConv.Free;
 end;
 if UrlFired = False then
   WinExec(StrPCopy(@p, URL), SW_SHOWNORMAL);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 StartNewBrowserWindow('http://www.borland.com');
 StartNewBrowserWindow('http://www.yahoo.com');
end;



[12] nikkie ©   (02.04.04 01:20)

>Игорь Шевченко
вон оно как... оказывается ICQ на дельфи написано ;))

первый вариант какой-то дурацкий - берется имя exe, ассоциированного с html, все его параметры фигачатся напрочь, и url передается единственным параметром. а если url неизвестному браузеру должен передаваться не просто как первый параметр, а с каким-то ключом? а если url передается через DDE? наконец, если просто в url присутствует пробел, то будет проблема, мне кажется...

второй вариант потрясает воображение, но вероятно в нем и есть сермяжная правда. если netscape точно также открывал url в старом окне.

ладно. вот мой вариант. интересно будет услышать, как он работает, когда дефолтный браузер - не IE.

// (c) nikkie, 2004
procedure OpenBrowser(Handle: HWND; Url: String);
var
 CommandLine: String;
 IE: OleVariant;
begin
 CommandLine := '';
 with TRegistry.Create do try
   RootKey := HKEY_CLASSES_ROOT;
   OpenKey('\http\shell\open\command', False);
   try
     CommandLine := ReadString('');
   finally
     CloseKey;
   end;
 finally
   Free;
 end;
 if Pos('iexplore', CommandLine) > 0 then begin
   IE := CreateOleObject('InternetExplorer.Application');
   IE.Visible := True;
   IE.Navigate(Url);
 end else begin
   if ShellExecute(Handle, 'open', PChar(Url), nil, nil, SW_SHOWNORMAL) <= 32 then
     RaiseLastWin32Error;
 end;
end;


ЗЫ кто копирует и публикует код, не сохраняя копирайта, тот редиска и вообще будет тому плохо. :)



[13] Игорь Шевченко ©   (02.04.04 10:28)

nikkie ©   (02.04.04 01:20)

ICQ вообще-то на С написано. Или на С++.

Если кому интересно, как работает именно ICQ, я в следующий раз буду код на С приводить :P

Кстати, в одном из RSDN Magazine'ов в Q&A (если мне память не изменяет) обсуждается вопрос открытия страницы в новом окне с учетом разных браузеров, под рукой журнала нету.



[14] nikkie ©   (02.04.04 13:52)

>в одном из RSDN Magazine'ов в Q&A
если попадется под руку - посмотри. но не думаю, что там открытие какое-то сделано. вот на сайте нашел у них наиболее содержательную тему:
http://www.rsdn.ru/forum/Message.aspx?mid=15289

из новых для меня соображений на эту тему - AssocQueryString (но вроде функционально нового ничего не добавит, зато повышенные требования - должен быть IE5) и параметр EditFlags, на которые там некоторые напирают, только зачем он нужен, я не знаю.

а на второй страничке темы - демонстрация того, что первый код из
http://www.swissdelphicenter.ch/torry/showcode.php?id=490
работает не всегда.





Страница с форумов сайта Мастера Delphi. Оригинал находится здесь. Сохранено клиентом для форума DMClient.

Hosted by uCoz