原文地址:http://blog.163.com/fyz_seven/blog/static/1552536302011520105756360/
直接上代码: 后面附带注释 (代码是我从网上搜下来的,然后经过我的机器调试,并且编译通过的)
本文用到了COM组件的相关知识,ATL的相关知识
#include <atlbase.h>
CComModule _Module;
#include <atlwin.h>
#include <windows.h>
#pragma comment(lib,"atl")
#pragma comment(lib,"User32.lib")
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
RECT rc;
IWebBrowser2* iWebBrowser;
VARIANT varMyURL;
static CAxWindow WinContainer;
LPOLESTR pszName=OLESTR("shell.Explorer.2");
GetClientRect(hWnd, &rc);
switch(message)
{
case WM_CREATE:
WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE);
WinContainer.CreateControl(pszName);
WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);
VariantInit(&varMyURL);
varMyURL.vt = VT_BSTR;
varMyURL.bstrVal = SysAllocString(_T("http://www.163.com/"));
iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);
VariantClear(&varMyURL);
iWebBrowser-> Release();
break;
case WM_SIZE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (int)DefWindowProc(hWnd,message,wParam,lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
static TCHAR szAppName[]=TEXT("WebBrowser");
static TCHAR szClassName[]=TEXT("WebBrowser");
HWND hWnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(hInstance, IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szClassName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("Error!"),szAppName,MB_ICONERROR);
return 0;
}
//HRESULT hRes = _Module.Init(NULL, hInstance);
GUID guid;
HRESULT hRes = _Module.Init(NULL, hInstance, &guid);
hWnd=CreateWindow(szClassName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
工程:很简单,我用的是 VS2005 建立一个WIN32工程,注意是空项目,建立后,什么也没有!这时候你可以向里面增加一个CPP文件,然后将代码拷贝过去!编译运行!
需要注意:项目->右键->属性->配置属性选项下 ->ATL属性下 选择"静态链接到ATL"
解析:
黑色字体的地方就不解释了,如果不熟悉去看下Win32的搭建(不要看MFC,MFC将这些封装的死死的,你很不容易看见的,遇见不熟悉的的语句,可以去百度或者GOOGLE搜索一下,你懂的)
彩色字体的地方
CComModule _Module;
GUID guid;
HRESULT hRes = _Module.Init(NULL, hInstance, &guid);
以上就是COM模块的初始化,具体干些什么我也不懂,有朋友解释一下最好!如果没有他的话会报错误"就是那种初始化的错误(当然,我是指你使用ATL静态链接的时候)",还有接下来我们需要使用ATL的一些东西,所有,还是需要初始化这个模块的!
红色字体部分
IWebBrowser2* iWebBrowser; 浏览器的核心,获取的这个指针,你就相当于控制了整个IE,比如IE的基本操作,跳转,向前,向后,等等!其实怎么获取它,是我们的一个难题!它就是一个ACTIVE对象!
static CAxWindow WinContainer; ACTIVE对象的容器,这个容器存放ACTIVE对象,重要的是,我认为,他可以将ACTIVE和WIN32窗口关联起来,这可是个纽带啊!
WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE); 看见了吧,hWnd正是你这个Win32窗口的句柄
LPOLESTR pszName=OLESTR("shell.Explorer.2"); 这个是通过那个字符串获取了IE的字符串,有兴趣的同学需要梳理一下这里,GUID ,CLSID, LIBID, IID, CATID 看下有好处的,我回过头来也应该看看这些,弄清晰些!注册表啊,注册表!
WinContainer.CreateControl(pszName); 这里开始创建该类名对应的Actvie控件了
WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser); 这里要查询并获取IWebBrowser2这个指针了!__uuidof这个关键字很强大啊,他可以根据类名获取其对应的ID号。注意我这里只是获取IWebBrowser指针,你当然可以获取其他的Active对象指针!只不过第一个参数的ID和第二个对象要对应上哦!当然还要跟你CreateControl所创建Active对象有关喽。你要创建什么Active对象,找好对应关系吧啊!我是这样理解的!
VariantInit(&varMyURL);
varMyURL.vt = VT_BSTR;
varMyURL.bstrVal = SysAllocString(_T("http://www.163.com/"));
iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);
VariantClear(&varMyURL);
这些就是该对应的具体应用了!
iWebBrowser-> Release(); //计数减少!就这样吧!这个应该不用写到这里吧!