天天看点

WIN32 应用程序内嵌IE浏览器(注意非MFC)

原文地址: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();  //计数减少!就这样吧!这个应该不用写到这里吧!