Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Размещение ActiveX - MicrosoftWebBrowser в WinAPI [D6, WinXP]


Альберт ©   (2007-11-14 00:02:00) 

Здравствуйте! Подскажите, пожалуйста, каким образом можно создать окно WebBrowser'a на своей форме (код полностью на winapi). Ничего не нашел на других форумах..


Альберт   (2007-11-17 00:27:00) [1]

данный пример запускает отдельное окно ie и может получить доступ к содержимому:


const
       BrowserID : TGUID ='{D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}';
       IEID : TGUID = '{0002DF01-0000-0000-C000-000000000046}';
       CLSID_WebBrowser: TGUID = '{8856F961-340A-11D0-A96B-00C04FD705A2}';

function CoInitialize(pvReserved: Pointer): HResult; stdcall; external
 'ole32.dll' name 'CoInitialize';

procedure CoUninitialize; stdcall; external 'ole32.dll' name 'CoUninitialize';

function CoCreateInstance(const clsid: TGUID; unkOuter: IUnknown;
 dwClsContext: Longint; const iid: TGUID; out pv): HResult; stdcall; external
 'ole32.dll' name 'CoCreateInstance';

const
 CLSCTX_INPROC_SERVER = 1;
 CLSCTX_INPROC_HANDLER = 2;
 CLSCTX_LOCAL_SERVER = 4;
 CLSCTX_REMOTE_SERVER = 16;
 CLSCTX_NO_CODE_DOWNLOAD = 400;
 CLSCTX_NO_FAILURE_LOG = 4000;
 CLSCTX_SERVER = (CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER or  CLSCTX_REMOTE_SERVER) ;
 CLSCTX_ALL  = CLSCTX_INPROC_HANDLER or CLSCTX_SERVER;

procedure myWB;
 var
       CLSID: TGUID;
       WB:IWebBrowser2;
       url, null:OleVariant;
begin

null:=0;
url:='about:blank';

   Coinitialize(nil);

 if (CoCreateInstance(IEID, nil, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, WB)<> 0)
then
 begin
   CoUninitialize;
   exit;
 end;

 WB.Left :=0;
 WB.Height:=100;
 WB.Top :=0;
 WB.Width:=100;
 WB.Visible:=true;
 WB.Navigate2(url, null, null, null, null);

end;


вставив свои интерфейсы можно отвязаться от стандартных больших модулей..

ниже напишу свои наблюдения по поводу контролов.


>  зачем непонятно такие усилия

ну мы программеры, вспомните времена доса)) ностальгия. ну хочется чуда немного) поймите правильно


DVM   (2007-11-16 21:32:00) [2]


> думаю, что нужно делать постепенную отвязку от стандартных
> модулей

потом подумай над отвязкой от kernel32.dll, user32.dllm, gdi32.dll, программа еще меньше станет.


DVM   (2007-11-16 21:30:00) [3]


> Альберт  

лезть работать с COM и ActiveX на "чиста API" пустая трата времени. Т.е. сделать то можно, но зачем непонятно такие усилия.


Альберт   (2007-11-15 13:02:00) [4]

http://www.kakeeware.com/download.php?f=kb_ie_mo_src.zip
может кто-то разбирается в асме? там всего лишь перечисление интерфейсов и несколько вызовов функций.

может это легче перевести на delphi чем перемалывать весь controls и далее..


Альберт   (2007-11-15 12:13:00) [5]

думаю, что нужно делать постепенную отвязку от стандартных модулей


Альберт   (2007-11-15 11:58:00) [6]


var compon:TAxControl;

begin
compon:=TAxControl.Create(self,stringtoguid
('{8856F961-340A-11D0-A96B-
00C04FD705A2}'));
  compon.Parent:=panel1;
  compon.Visible:=true;
  compon.Top:=20;
  compon.Left:=0;
compon.OleObject.Navigate2('http://
activex.microsoft.com/activex/controls/sapi/
spchapi.exe.',0,0,00);
end;


Альберт   (2007-11-15 11:54:00) [7]

>> WB := TWebBrowser.Create(Form1); WB_Handle:=WB.Handle;
>> Form1_Handle:= Form1.Handle;
>Это называеться WinApi ? Полазий по исходникам twebBrowser - многое поймешь.

так нужно как раз и заменить эти строки. от Form сделал его нещависимым. нашел рализацию ActiveX container из статьи Альберта Мамедова.


unit axControl;
{ Класс-контейнер для ActiveX (компонента
управления). }
interface
uses
Windows, Messages, Classes, Controls,
ActiveX, OleCtrls,StdCtrls; //
///
********************************************************************
type
TAxControl = class(TOleControl)//
private
CControlData : TControlData2; //
Информация об ActiveX.
protected
procedure InitControlData; override;
public
property CData : TControlData2 read
CControlData;
constructor Create (AOwn :
TComponent;AGUID : TGUID);
end;
implementation
//////////////////////////////////////////////////////////////////
////////////
constructor TAxControl. Create (AOwn :
TComponent ;AGUID : TGUID);
begin
FillChar(CControlData,sizeof(CControlData),0);
// Обнуляете поле с информацией об Active
CControlData.ClassID :=AGUID; //
Указываете QUID компонента,который
будет создаваться.
inherited Create (AOwn); // Вызываете
конструктор предка.
ControlStyle := ControlStyle +
[csClickEvents]; // Стиль отображения
end ;
//////////////////////////////////////////////////////////////////
/////////////////
procedure TAxControl. InitControlData;
begin
ControlData := @CControlData; //
Указываете адрес, где находится
информация об ActiveX.
end;

//////////////////////////////////////////////////////////////////
////////////////////
end.


но вот одна проблема, что он базируется на controls


tesseract   (2007-11-15 10:50:00) [8]


>  WB := TWebBrowser.Create(Form1);    WB_Handle:=WB.Handle;
>    Form1_Handle:= Form1.Handle;


Это называеться WinApi ? Полазий по исходникам twebBrowser - многое поймешь.


Альберт   (2007-11-14 19:25:00) [9]

ну так сомо описание интерфейса же мало весит IWebBrowser2. мне он в принципе и нужен.. заменить бы строчку выделенную жирным и не мучиться..

var
       WB: TWebBrowser;
       WB_Handle, Form1_Handle:hwnd;
       WND_RECT:TRECT;
begin
  WB := TWebBrowser.Create(Form1);

   WB_Handle:=WB.Handle;
  Form1_Handle:= Form1.Handle;

  Windows.GetWindowRect(Form1_Handle,WND_RECT);
  Windows.SetParent(WB_Handle, Form1_Handle);
  Windows.SetWindowPos(
                       WB_Handle,
                       Form1_Handle,
                       0, 0,
                       WND_RECT.Right  - WND_RECT.Left - 10,
                       WND_RECT.Bottom - WND_RECT.Top - 10,
                       SWP_NOZORDER);

 WB.Navigate('about:blank');
end;

может кто разберется, пример на асме
http://www.kakeeware.com/download.php?f=kb_ie.exe
http://www.kakeeware.com/download.php?f=kb_ie_mo_src.zip


tesseract   (2007-11-14 18:01:00) [10]


> есть ли более интересные способы, которые мало весят?


А этот что тяжеловес, что ли ? Учитывая что придеться с собой в любом случае IE нужной версии таскать ?


Альберт   (2007-11-14 09:09:00) [11]

ну выразился так. назвал окно программы распространенным названием. не мог бы помочь?


Германн   (2007-11-14 02:12:00) [12]


> Альберт ©   (14.11.07 00:02)


> Подскажите, пожалуйста, каким образом можно создать окно
> WebBrowser'a на своей форме (код полностью на winapi).

Когда ты это писАл, ничего тебя не смущало?


Альберт   (2007-11-14 01:05:00) [13]

при подключении модуля shdocvw вес программы до 390 кб. есть ли более интересные способы, которые мало весят?


JSman   (2007-11-14 00:41:00) [14]

CreateOleObject


Наверх

Титульная страница Поиск, карта сайта Написать письмо