Форум: "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=490uses
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