#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(); //计数减少!就这样吧!这个应该不用写到这里吧!
如果你开始写Active或者做相关这方面的工作,相信,上面的你应该能大概看懂的吧!有错误的请指教哈! 大家一起加油哦!
|