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.   

    代码如下:
    // 用于确定 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;
    }
      

  2.   

    查看工程的Post-build中的command是否能正确执行,你的COM组件是否生成对应的文件