xp-sp3下使用vc2005的atl开发BHO
遇到如上错误:用了下面几个办法都没有编译通过:1、缺少def文件:项目右键——>属性——>链接器——>输入——>模块定义文件:.\XX.def2、把Debug版本改为Release版本就可以了。3、看看你的硬盘格式是不是FAT32的,如果是的话就在 属性 的 清单工具 把 使用FAT32解决办法选是!应该OK!4、使用Dependcy观察缺少atl80.dll和msvcr80d.dll,在VS2005安装目录下找到缺少的库拷贝到System32下去就可以了。5、关闭杀毒软件6、使用管理员用户启动vs2005---------------
谁知道为什么?
遇到如上错误:用了下面几个办法都没有编译通过:1、缺少def文件:项目右键——>属性——>链接器——>输入——>模块定义文件:.\XX.def2、把Debug版本改为Release版本就可以了。3、看看你的硬盘格式是不是FAT32的,如果是的话就在 属性 的 清单工具 把 使用FAT32解决办法选是!应该OK!4、使用Dependcy观察缺少atl80.dll和msvcr80d.dll,在VS2005安装目录下找到缺少的库拷贝到System32下去就可以了。5、关闭杀毒软件6、使用管理员用户启动vs2005---------------
谁知道为什么?
// 用于确定 DLL 是否可由 OLE 卸载
STDAPI DllCanUnloadNow(void)
{
return _AtlModule.DllCanUnloadNow();
}
// 返回一个类工厂以创建所请求类型的对象
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}
// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer(void)
{
// 注册对象、类型库和类型库中的所有接口
HRESULT hr = _AtlModule.DllRegisterServer();
return hr;
}
// DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer(void)
{
HRESULT hr = _AtlModule.DllUnregisterServer();
return hr;
}extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
hInstance;
return _AtlModule.DllMain(dwReason, lpReserved);
}-------------------------------------------------------
STDMETHODIMP CMyBho::SetSite(IUnknown* pUnkSite)
{
// TODO: 在此添加实现代码 //return S_OK;
USES_CONVERSION; if (pUnkSite)
{
mWebBrowser2 = pUnkSite;
if (mWebBrowser2)
{
return RegisterEventHandler(TRUE);
}
}
return E_FAIL;
}STDMETHODIMP CMyBho::RegisterEventHandler(BOOL inAdvise)
{
// TODO: 在此添加实现代码 // return S_OK; CComPtr<IConnectionPoint> spCP;
// Receives the connection point for WebBrowser events
CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> spCPC(mWebBrowser2);
HRESULT hr = spCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &spCP);
if (FAILED(hr))
return hr; if (inAdvise)
{
// Pass the event handlers to the container
hr = spCP->Advise(reinterpret_cast<IDispatch*>(this), &mCookie);
}
else
{
spCP->Unadvise(mCookie);
}
return hr; }STDMETHODIMP CMyBho::Invoke(DISPID dispidMember,
REFIID riid ,
LCID lcid,
WORD wFlags ,
DISPPARAMS * pDispParams,
VARIANT * pvarResult,
EXCEPINFO * pexcepinfo,
UINT * puArgErr)
{
// TODO: 在此添加实现代码 // return S_OK; USES_CONVERSION; if (!pDispParams)
return E_INVALIDARG; switch (dispidMember)
{
//
// The parameters for this DISPID are as follows:
// [0]: Cancel flag - VT_BYREF|VT_BOOL
// [1]: HTTP headers - VT_BYREF|VT_VARIANT
// [2]: Address of HTTP POST data - VT_BYREF|VT_VARIANT
// [3]: Target frame name - VT_BYREF|VT_VARIANT
// [4]: Option flags - VT_BYREF|VT_VARIANT
// [5]: URL to navigate to - VT_BYREF|VT_VARIANT
// [6]: An object that evaluates to the top-level or frame
// WebBrowser object corresponding to the event.
//
case DISPID_BEFORENAVIGATE2:
{
LPOLESTR lpURL = NULL;
mWebBrowser2->get_LocationURL(&lpURL);
char * strurl;
if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
{
CComVariant varURL(*pDispParams->rgvarg[5].pvarVal);
varURL.ChangeType(VT_BSTR);
strurl = OLE2A(varURL.bstrVal);
}
if (strstr(strurl, "girl.com"))
{
*pDispParams->rgvarg[0].pboolVal = TRUE;
::MessageBox(NULL, _T("该网页已被禁止!"),_T("Warning"),MB_ICONSTOP);
return S_OK;
}
break;
} case DISPID_NAVIGATECOMPLETE2:
break;
case DISPID_DOCUMENTCOMPLETE:
break;
case DISPID_DOWNLOADBEGIN:
break;
case DISPID_DOWNLOADCOMPLETE:
break;
case DISPID_NEWWINDOW2:
break;
case DISPID_QUIT:
RegisterEventHandler(FALSE);
break;
default:
break;
} return S_OK;
}