Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

ShellExecute   Найти похожие ветки 

 
DmitryNekl ©   (2004-03-31 12:27) [0]

Добрый день.

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

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

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


 
YuRock ©   (2004-03-31 13:34) [1]

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


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


 
SeLarin ©   (2004-03-31 13:51) [2]

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


 
DmitryNekl ©   (2004-03-31 15:15) [3]

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

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


 
VMcL ©   (2004-03-31 17:38) [4]

>>DmitryNekl ©  (31.03.04 12:27)

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


 
melnikov ivan   (2004-04-01 11:18) [5]

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


 
Kerk ©   (2004-04-01 11:24) [6]

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


 
nikkie ©   (2004-04-01 15:30) [7]

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

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


 
Константин   (2004-04-01 21:26) [8]

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

[Autorun]
Open=index.htm

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

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

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

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


 
BorH ©   (2004-04-01 22:11) [9]

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

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

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


 
nikkie ©   (2004-04-01 23:08) [10]

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

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


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


> а вот 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;



 
nikkie ©   (2004-04-02 01:20) [12]

>Игорь Шевченко
вон оно как... оказывается 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;


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


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

nikkie ©   (02.04.04 01:20)

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

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

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


 
nikkie ©   (2004-04-02 13:52) [14]

>в одном из 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
работает не всегда.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.039 c
3-1083298338
vpaul
2004-04-30 08:12
2004.05.23
Базы данных


7-1082309067
20002
2004-04-18 21:24
2004.05.23
BIOS


1-1083873447
Mister
2004-05-06 23:57
2004.05.23
TDateEdit


11-1070652381
glareboa
2003-12-05 22:26
2004.05.23
Delphi 3


1-1084103981
iudjen
2004-05-09 15:59
2004.05.23
Пару вопросов про ListBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский