Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Написать инсталяционный плагин к IE на Дельфи


Автор: sousouiti36 4.5.2006, 12:15
Привет всем! 
Надо было напсать инсталяционный плагин к IE на Дельфи, основная цель доделана осталось только пользовательская часть для этого достаточно интегрировать одну кнопку в IE, нашел в форумах вот эту статью:

Если надо создать кнопку в IE, то вот готовые решение 
---------------------------------------------------------------------


ButtonText = Всплывающая подсказка к кнопке 
MenuText = Текст, который будет использован для пункта в меню "Сервис" 
MenuStatusbar = *Ignore* 
CLSID = Ваш уникальный classID. Для создания нового CLSID (для каждой кнопки) можно использовать GUIDTOSTRING. 
Default Visible := Показать ей. 
Exec := Путь к Вашей программе. 
Hoticon := иконка из shell32.dll когда мышка находится над кнопкой 
Icon := иконка из shell32.dll 



Код

procedure CreateExplorerButton;
const
  TagID = '\{10954C80-4F0F-11d3-B17C-00C0DFE39736}';
var
  Reg: TRegistry;
  ProgramPath: string;
  RegKeyPath: string;
begin
  ProgramPath := 'c:\folder\exename.exe';
  Reg := TRegistry.Create;
  try
    with Reg do
    begin
      RootKey := HKEY_LOCAL_MACHINE;
      RegKeyPath := 'Software\Microsoft\Internet Explorer\Extensions';
      OpenKey(RegKeyPath + TagID, True);
      WriteString('ButtonText', 'Your program Button text');
      WriteString('MenuText', 'Your program Menu text');
      WriteString('MenuStatusBar', 'Run Script');
      WriteString('ClSid', '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}');
      WriteString('Default Visible', 'Yes');
      WriteString('Exec', ProgramPath);
      WriteString('HotIcon', ',4');
      WriteString('Icon', ',4');
    end
  finally
    Reg.CloseKey;
    Reg.Free;
  end;
end;
 

Этот код решил задачу в какой то степени, но так как плагин инсталяционный после uninstall'а эта кнопка остается в IE, эт потому
что после uninstall'а в реестре не удаляются те значения которые указанны в коде.
Еще одна проблемка в том что я не могу ни как добратся до события этой кнопки, это мне нужно
для того чтоб сделать еще дополнительные действия при нажатии этой кнопки.
 

Автор: Rouse_ 5.5.2006, 01:04
Ну во первых ты не показал где у тебя находиться инсталяционные данные. Если это тот код который ты привел - то тут большое заблуждение с твоей стороны. 
Во вторых: в процессе деинсталяции для удаления кнопки просто удали ветвь созданную в OpenKey(RegKeyPath + TagID, True);
В третьих: ты и не должен добираться до событий кнопки, ибо это просто картинка отображаемая на панели браузера. Он при щелчке в координатах заданной тобой кнопки активизирует твой СОМ-сервер или приложение который(ое) и получает на себя управление. Работай уже в нем. Самое первое событие (которое ты сможешь обработать) будет как раз результат нажатия кнопки.
В четвертых: всеже добраться до кнопок можно, но придется работать с ShellExtensions и вызывать их методы. Начинай с IInputObject 

Автор: sousouiti36 5.5.2006, 12:22
Заранее спасибо вам и приношу свои извинение если мой ответ вас заденит smile !

Цитата(Rouse_ @  5.5.2006,  01:04 Найти цитируемый пост)
Ну во первых ты не показал где у тебя находиться инсталяционные данные. Если это тот код который ты привел - то тут большое заблуждение с твоей стороны. 


Во первых вы разясните какие данные?, до инсталяции или после? Если вы имеете ввиду до инсталяции то какая разница где находятся инсталяцыонные данные? И кроме того с помощью этого кода я сделал кнопку в IE (это не тот код).

 

Цитата(Rouse_ @  5.5.2006,  01:04 Найти цитируемый пост)
Во вторых: в процессе деинсталяции для удаления кнопки просто удали ветвь созданную в OpenKey(RegKeyPath + TagID, True);

Вопрос таков как добратся до процесса деинсталяции?

Цитата(Rouse_ @  5.5.2006,  01:04 Найти цитируемый пост)
В третьих: ты и не должен добираться до событий кнопки, ибо это просто картинка отображаемая на панели браузера. Он при щелчке в координатах заданной тобой кнопки активизирует твой СОМ-сервер или приложение который(ое) и получает на себя управление. Работай уже в нем. Самое первое событие (которое ты сможешь обработать) будет как раз результат нажатия кнопки.

Задача такова: при нажатии этой кнопки я должен скопировать в буфер обмена УРЛ которое находится в IE и поставить его в текстбокс запускаемого приложения.



Цитата(Rouse_ @  5.5.2006,  01:04 Найти цитируемый пост)
В четвертых: всеже добраться до кнопок можно, но придется работать с ShellExtensions и вызывать их методы. Начинай с IInputObject 

Нахожу самой полезной четвертую причину так как в нем есть уже какие то предложения решения этой задачи smile 

Вопрос таков: Как и откуда мне добратся до IInputObject, ShellExtensions и как работать с методами  ShellExtensions? 
Если можно дайте ссылки где можно про все это прочитать smile 
 

Автор: Rouse_ 5.5.2006, 17:28
Держи рабочий пример:

Код

unit Unit14;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, Registry, SHDocVw, StdCtrls;

type
  TForm14 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form14: TForm14;

implementation

{$R *.dfm}

procedure CreateExplorerButton;
var
  ProgramPath: string;
  RegKeyPath: string;
begin
  ProgramPath := '"' + ParamStr(0) + '"';
  with TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    RegKeyPath := 'Software\Microsoft\Internet Explorer\Extensions' +
      '\{10954C80-4F0F-11d3-B17C-00C0DFE39736}';
    if OpenKey(RegKeyPath, True) then
    try
      WriteString('ButtonText', 'Your program Button text');
      WriteString('MenuText', 'Your program Menu text');
      WriteString('MenuStatusBar', 'Run Script');
      WriteString('ClSid', '{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}');
      WriteString('Default Visible', 'Yes');
      WriteString('Exec', ProgramPath);
      WriteString('HotIcon', ',4');
      WriteString('Icon', ',4');
    finally
      CloseKey;
    end;
  finally
    Free;
  end;
end;

procedure DeleteExplorerButton;
var
  RegKeyPath: string;
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_LOCAL_MACHINE;
    RegKeyPath := 'Software\Microsoft\Internet Explorer' +
      '\Extensions\{10954C80-4F0F-11d3-B17C-00C0DFE39736}';
    DeleteKey(RegKeyPath);
  finally
    Free;
  end;
end;

procedure TForm14.FormCreate(Sender: TObject);
var
  iShellWindow: IShellWindows;
  iWB: IWebBrowserApp;
  spDisp: IDispatch;
  I, ExplorerHandle: Integer;
  IsFound: Boolean;
begin
  ExplorerHandle := GetForegroundWindow;
  if ParamCount > 0 then
    case ParamStr(1)[2] of
      'i':
      begin
        CreateExplorerButton;
        ShowMessage('Программа успешно установлена.');
        Halt;
      end;
      'u':
      begin
        DeleteExplorerButton;
        ShowMessage('Программа успешно удалена.');
        Halt;
      end;
    else
      ShowMessage('Используйте следующие параметры командной строки:' + sLineBreak +
        '-i для установки;' + sLineBreak +
        '-u для удаления;' + sLineBreak +
        'Для получения спраки запустите программу без параметров.');
      Halt;
    end;

  iShellWindow := CoShellWindows.Create;
  for I := 0 to iShellWindow.Count - 1 do
  begin
    spDisp := iShellWindow.Item(I);
    if spDisp = nil then Continue;
    spDisp.QueryInterface(IWebBrowserApp, iWB);
    if iWB <> nil then
      if iWB.HWnd = ExplorerHandle then
      begin
        Edit1.Text := iWB.LocationURL;
        Exit;
      end;
  end;
  Halt;
end;

end.
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)