Archive for the ‘技术’ Category

IE接口实现浏览器窗口

花了两天时间终于简单地实现了利用IE接口实现自己的浏览器窗口。

关于IE接口的MSDN文档太多了,使用IWebBrowser2接口转到URL、加载HTML、解析HTML这些功能一般都会从各种途径知道。但是如何使用自己的窗口来显示网页的资料少之又少。下面是些参考资料:

微软示例代码(里面的htmldlg.exe有用到MSHTML.DLL的ShowHTMLDialog导出函数)

Embed an HTML control in your own window using plain C(讲解详细,很好的参考资料)

Display a Web Page in a Plain C Win32 Application(和上一篇差不多,就没仔细看了)

要想通过自己的窗口来展示网页,必须实现三个接口IOleClientSite、IOleInPlaceFrame、IOleInPlaceSite。这三个接口用于OLE对象(即这里的CLSID_WebBrowser)和容器窗口交互、通信。下面是实现存档:

IEInstance.h

IEInstance.cpp

WinMain.cpp

另外,可以通过CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (LPVOID *)&m_pIWB2);再调用IWebBrowser2的Navigate2来用IE打开指定网页。

RegisterClass

 

 

 

 

 

 

 

 

 

 

 

 

RegisterClass逆向

http://bbs.pediy.com/showthread.php?t=139853

IsDebuggerPresent

这个逆向太简单了,不解释。

COM笔记(二)

自注册进程内组件必须实现DllRegisterServer和DllUnregisterServer,通过regsvr32.exe实现注册表的注册与卸载。

自注册进程外组件必须处理命令行参数/RegServer和/UnregServer,通过它实现注册表的注册与卸载。

进程外组件模型与进程和ntdll.dll的模型类似,只和存根打交道,由存根通过LPC/RPC完成交互。

参数列集:参数及调用等信息打包传递的过程;散集:解包过程。

为什么要用注册表?为了实现组件位置透明!由COM库负责读取并创建组件(对象)。

COM规定,每一个COM对象应该有一个相应的类厂对象。为什么要有类厂这层间接性?

DllGetClassObject(类厂对象标识, IID_IClassFactory, 类厂接口指针)

类厂的LockServer函数引入锁计数是为了防止组件的所有对象都已释放,但仍需保留类厂接口指针用以在不确定的时候再创建对象。

CoGetClassObject(COM库)--->位置透明性--->DllGetClassObject(组件实现并导出)--->创建类厂并获得其指针接口--->

CoGetClassObject(COM库)--->位置透明性--->启动进程外组件进程--->CoRegisterClassObject(自注册类厂)--->返回类厂信息--->

CoCreateInstance是对CoGetClassObject的封装,不需要直接和类厂打交道了,直接获得对象的接口指针。CoCreateInstanceEx用于创建远程机器上的COM对象。

聚合模型不仅需要外包对象的支持,还需要被聚合对象的支持。因为外包对象会直接返回被聚合对象的接口指针给客户,通过该接口指针QueryInterface IUnkown接口及外包对象的接口时必须满足COM的要求。

要实现聚合外包对象需把自己的IUnkown接口指针传递给被聚合对象保存;被聚合对象实现IUnkown(即委托的IUnkown)和非委托的IUnkown两个IUnkown接口,根据是否有外包对象传入的IUnkown接口指针来调用外包对象的接口或自己的非委托IUnkown。

COM线程类型:与UI线程相对应,有消息循环的叫套件线程;与辅助线程对应,没有消息循环的叫自由线程。COM的线程特征是针对COM对象的,而非COM组件。

COM笔记(一)

COM组件对象模型提供了组件之间交互的规范,不依赖于任何特定的语言,它提供了一种规范、标准。

OLE(对象链接和嵌入)以COM规范为基础,继OLE后Microsoft推出的以COM规范为基础的技术统称ActiveX技术。

组件软件的关键是接口,因此,软件组件应遵从统一标准。COM就是一套公用标准,COM标准包括规范和实现两部分,规范定义了组件间的通信规则,实现则是COM库。

接口是一组逻辑上相关的函数(接口成员函数)的集合。

在COM模型中,对象本身对于客户来说是不可见的,只能通过接口请求服务。

每个接口由一个128位的GUID来标识:客户--->GUID--->接口指针--->接口成员函数。

每个对象也由一个GUID来标识,称为CLSID:客户--->CLSID--->对象的某个接口指针。可以从某个接口指针得到该对象的任意其它接口。

COM组件本身是位置透明的,即只需要调用接口,组件的加载,对象的创建由COM库完成。

COM中包容模式是对象1传递调用给对象2;聚合模型是虽然也不知道对象2的存在,但是直接返回对象2的接口给用户使用。

COM对象为什么要使用引用计数?因为客户个数及什么时候请求服务是不确定的,直接delete释放对象是不安全的。

IDL(接口描述语言)提供了一种不依赖于任何语言的接口描述方法。在VC++中使用IDL其实是MIDL工具将.idl文件编译成C/C++兼容的接口描述头文件。

接口只是一种定义,并不包括实现,具体的实现是在COM对象中,因此,接口继承只继承了成员函数的说明。

接口继承只允许单继承,为什么?因为接口的内存模型中只有一个虚指针,多重继承会出现多个!

接口原则中有一点:对于同一个对象的不同接口指针查询到的IUnkown接口必须相同。这是因为一个COM对象实现了多个接口时,其虚指针会有多个,且虚表中的IUnkown(保存其成员函数地址的位置)会有多份!

无觅相关文章插件,快速提升流量