![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размещение 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