C++ 更改局域网代理

C++ 更改局域网代理,c++,internet-explorer,visual-c++,bho,C++,Internet Explorer,Visual C++,Bho,我想从BHO仅为Internet Explorer启用代理,或者如果不可能,至少为LAN设置代理。 执行下面的代码后,什么也没有发生,代理未更改且未启用。 我想在用户访问网站时更改代理设置,理想情况是,如果可以只为internet explorer启用代理,那么其他程序可以正常工作,直接连接不需要代理,因此如果可以只为internet explorer设置代理,请告诉我如何操作,如果可能的话,我也想使用PAC自动化脚本 此代码没有错误,但未启用代理,并且未发生任何情况: INTERNET_PER

我想从BHO仅为Internet Explorer启用代理,或者如果不可能,至少为LAN设置代理。 执行下面的代码后,什么也没有发生,代理未更改且未启用。 我想在用户访问网站时更改代理设置,理想情况是,如果可以只为internet explorer启用代理,那么其他程序可以正常工作,直接连接不需要代理,因此如果可以只为internet explorer设置代理,请告诉我如何操作,如果可能的话,我也想使用PAC自动化脚本

此代码没有错误,但未启用代理,并且未发生任何情况:

INTERNET_PER_CONN_OPTION_LIST conn_options;    
    BOOL    bReturn;    
    DWORD   dwBufferSize = sizeof(conn_options);           

    conn_options.dwSize = dwBufferSize;    
    conn_options.pszConnection = NULL;//connNameStr;//NULL == LAN   
    conn_options.dwOptionCount = 3;    
    conn_options.pOptions = new INTERNET_PER_CONN_OPTION[3];   

     if(!conn_options.pOptions) ::MessageBox(NULL,_T("option error"),_T("option error"),MB_ICONSTOP);      

    conn_options.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;    
    conn_options.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT|PROXY_TYPE_PROXY;   
    conn_options.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;    
    conn_options.pOptions[1].Value.pszValue = TEXT("100.200.100.200:1020");    
    conn_options.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;    
    conn_options.pOptions[2].Value.pszValue = _T("local");     
    bReturn = InternetSetOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION, &conn_options, dwBufferSize);

delete [] conn_options.pOptions;   
bReturn = InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);    
bReturn = InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);    
上面的代码应该更改代理,但是如果我在文档完成事件的下面代码中使用它,它将编译成功,但不会更改代理

#include <windows.h>
#include <tchar.h>
#include <exdisp.h>
#include <exdispid.h>
#include <mshtml.h>
#include <mshtmdid.h>
#include <shlwapi.h>

HINSTANCE hInstance;
LONG gref=0;
const CLSID BhoCLSID = {0xC9C42510,0x9B41,0x42c1,0x9D,0xCD,0x72,0x82,0xA2,0xD0,0x7C,0x61};
#define BhoCLSIDs  _T("{C9C42510-9B41-42c1-9DCD-7282A2D07C61}")



class BHO : public IObjectWithSite, public IDispatch 
{ long ref;
  IWebBrowser2* webBrowser;
  IHTMLDocument* doc; IHTMLDocument2 *doc2;
  IHTMLWindow2 *win2;
public:
  // IUnknown...
  HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv) {if (riid==IID_IUnknown) *ppv=static_cast<BHO*>(this); else if (riid==IID_IObjectWithSite) *ppv=static_cast<IObjectWithSite*>(this); else if (riid==IID_IDispatch) *ppv=static_cast<IDispatch*>(this); else return E_NOINTERFACE; AddRef(); return S_OK;} 
  ULONG STDMETHODCALLTYPE AddRef() {InterlockedIncrement(&gref); return InterlockedIncrement(&ref);}
  ULONG STDMETHODCALLTYPE Release() {int tmp=InterlockedDecrement(&ref); if (tmp==0) delete this; InterlockedDecrement(&gref); return tmp;}

  // IDispatch...
  HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo) {*pctinfo=1; return NOERROR;}
  HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR*  ppTInfo) {return NOERROR;}
  HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid, DISPID FAR* rgDispId) {return NOERROR;}

  HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr)
  { 
    // DISPID_DOCUMENTCOMPLETE: This is the earliest point we can obtain the "document" interface
    if (dispIdMember==DISPID_DOCUMENTCOMPLETE)
    { if (!webBrowser) return E_FAIL; 
      IDispatch *idisp; webBrowser->get_Document(&idisp);
      if (idisp && !doc) idisp->QueryInterface(IID_IHTMLDocument, (void**)&doc);
      if (idisp && !doc2) idisp->QueryInterface(IID_IHTMLDocument2, (void**)&doc2);
      if (doc2 && !win2) doc2->get_parentWindow(&win2);
      IConnectionPointContainer *cpc=0; if (doc) doc->QueryInterface(IID_IConnectionPointContainer, (void**) &cpc);
      IConnectionPoint* cp=0; if (cpc) cpc->FindConnectionPoint(DIID_HTMLDocumentEvents2, &cp);
      DWORD cookie; HRESULT hr; if (cp) hr=cp->Advise(static_cast<IDispatch*>(this), &cookie);
      if (cp) cp->Release(); if (cpc) cpc->Release(); if (idisp) idisp->Release();
      if (!doc || !doc2 || !win2 || hr!=S_OK) {release(); return E_FAIL;}
      return NOERROR;
    }

    if (dispIdMember==DISPID_HTMLDOCUMENTEVENTS_ONCLICK)
    { // This shows how to respond to simple events.
      MessageBox(0,_T("Try pressing some keys on the keyboard!"),_T("BHO"),MB_OK); 
      return NOERROR;
    }

    if (dispIdMember==DISPID_HTMLDOCUMENTEVENTS_ONKEYDOWN)
    { // This shows how to examine the "event object" of an event
      IDispatch *param1=0; if (pDispParams->cArgs==1 && (pDispParams->rgvarg)[0].vt==VT_DISPATCH) param1=(pDispParams->rgvarg)[0].pdispVal;
      IHTMLEventObj *pEvtObj=0; if (param1) param1->QueryInterface(IID_IHTMLEventObj, (void**)&pEvtObj);
      long keycode; HRESULT hr; if (pEvtObj) hr=pEvtObj->get_keyCode(&keycode);
      if (pEvtObj) pEvtObj->Release();
      if (!pEvtObj || hr!=S_OK) return E_FAIL;
      // This shows how to manipulate the CSS style of an element
      int i=keycode-32; if (i<0) i=0; if (i>63) i=63; i*=4;
      wchar_t buf[100]; wsprintfW(buf,L"rgb(%i,%i,%i)",i,255-i,i/2);
      IHTMLElement *body=0; doc2->get_body(&body);
      IHTMLStyle *style=0; if (body) body->get_style(&style);
      VARIANT v; v.vt=VT_BSTR; v.bstrVal=buf;
      if (style) style->put_backgroundColor(v);
      if (style) style->Release(); if (body) body->Release();
      if (!body || !style) return E_FAIL;
      return NOERROR;
    }
    return NOERROR;
  }

  // IObjectWithSite...
  HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void** ppvSite) {return E_NOINTERFACE;}
  HRESULT STDMETHODCALLTYPE SetSite(IUnknown* iunk)
  { // This is called by IE to plug us into the current web window
    release();
    iunk->QueryInterface(IID_IWebBrowser2, (void**)&webBrowser);
    IConnectionPointContainer *cpc=0; iunk->QueryInterface(IID_IConnectionPointContainer, (void**)&cpc);
    IConnectionPoint* cp=0; if (cpc) cpc->FindConnectionPoint(DIID_DWebBrowserEvents2, &cp);
    DWORD cookie; HRESULT hr; if (cp) hr=cp->Advise(static_cast<IDispatch*>(this), &cookie);
    if (!webBrowser || !cpc || !cp || hr!=S_OK) {if (cp) cp->Release(); if (cpc) cpc->Release(); release(); return E_FAIL;}
    return S_OK;
  }

  // BHO...
  BHO() : ref(0), webBrowser(0), doc(0), doc2(0), win2(0) {};
  ~BHO() {release();}
  void release() {if (webBrowser) webBrowser->Release(); webBrowser=0; if (doc) doc->Release(); doc=0; if (doc2) doc2->Release(); doc2=0; if (win2) win2->Release(); win2=0;}

};







class MyClassFactory : public IClassFactory
{ long ref;
  public:
  // IUnknown... (nb. this class is instantiated statically, which is why Release() doesn't delete it.)
  HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv) {if (riid==IID_IUnknown || riid==IID_IClassFactory) {*ppv=this; AddRef(); return S_OK;} else return E_NOINTERFACE;}
  ULONG STDMETHODCALLTYPE AddRef() {InterlockedIncrement(&gref); return InterlockedIncrement(&ref);}
  ULONG STDMETHODCALLTYPE Release() {int tmp = InterlockedDecrement(&ref); InterlockedDecrement(&gref); return tmp;}
  // IClassFactory...
  HRESULT STDMETHODCALLTYPE LockServer(BOOL b) {if (b) InterlockedIncrement(&gref); else InterlockedDecrement(&gref); return S_OK;}
  HRESULT STDMETHODCALLTYPE CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) {*ppvObj = NULL; if (pUnkOuter) return CLASS_E_NOAGGREGATION; BHO *bho=new BHO(); bho->AddRef(); HRESULT hr=bho->QueryInterface(riid, ppvObj); bho->Release(); return hr;}
  // MyClassFactory...
  MyClassFactory() : ref(0) {}
};


STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{ static MyClassFactory factory; *ppvOut = NULL;
  if (rclsid==BhoCLSID) {return factory.QueryInterface(riid,ppvOut);}
  else return CLASS_E_CLASSNOTAVAILABLE;
}

STDAPI DllCanUnloadNow(void)
{ return (gref>0)?S_FALSE:S_OK;
}

STDAPI DllRegisterServer(void)
{ TCHAR fn[MAX_PATH]; GetModuleFileName(hInstance,fn,MAX_PATH);
  SHSetValue(HKEY_CLASSES_ROOT,_T("CLSID\\")BhoCLSIDs,_T(""),REG_SZ,_T("BHO"),4*sizeof(TCHAR));
  SHSetValue(HKEY_CLASSES_ROOT,_T("CLSID\\")BhoCLSIDs _T("\\InProcServer32"),_T(""),REG_SZ,fn,((int)_tcslen(fn)+1)*sizeof(TCHAR));
  SHSetValue(HKEY_CLASSES_ROOT,_T("CLSID\\")BhoCLSIDs _T("\\InProcServer32"),_T("ThreadingModel"),REG_SZ,_T("Apartment"),10*sizeof(TCHAR));
  SHSetValue(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects\\")BhoCLSIDs,_T(""),REG_SZ,_T(""),sizeof(TCHAR));
  return S_OK;
}

STDAPI DllUnregisterServer()
{ SHDeleteKey(HKEY_CLASSES_ROOT,_T("CLSID\\") BhoCLSIDs);
  SHDeleteKey(HKEY_LOCAL_MACHINE,_T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects\\")BhoCLSIDs);
  return S_OK;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ if (fdwReason==DLL_PROCESS_ATTACH) hInstance=hinstDLL;
  return TRUE;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
HINSTANCE HINSTANCE;
长gref=0;
常量CLSID BhoCLSID={0xC9C42510,0x9B41,0x42c1,0x9D,0xCD,0x72,0x82,0xA2,0xD0,0x7C,0x61};
#定义BhoCLSIDs(“C9C42510-9B41-42c1-9DCD-7282A2D07C61}”)
BHO类:带有站点的公共对象,公共IDispatch
{long ref;
iWebBrowser 2*网络浏览器;
IHTMLDocument*doc;IHTMLDocument2*doc2;
IHTMLWindow2*win2;
公众:
//我不知道。。。
HRESULT STDMETHODCALLTYPE查询接口(refid-riid,void**ppv){if(riid==IID\u IUnknown)*ppv=static\u cast(this);else if(riid==IID\u IObjectWithSite)*ppv=static\u cast(this);else if(riid==IID\u IDispatch)*ppv=static\u cast(this);else返回E\u NOINTERFACE;AddRef();返回S\u OK;}
ULONG STDMETHODCALLTYPE AddRef(){InterlockedIncrement(&gref);返回InterlockedIncrement(&ref);}
ULONG STDMETHODCALLTYPE Release(){int tmp=interlocatedDecrement(&ref);if(tmp==0)删除此项;interlocatedDecrement(&gref);返回tmp;}
//我相信。。。
HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR*pctinfo){*pctinfo=1;返回NOERROR;}
HRESULT STDMETHODCALLTYPE GetTypeInfo(未签名的int-iTInfo、LCID-LCID、ITypeInfo-FAR*FAR*ppTInfo){return NOERROR;}
HRESULT STDMETHODCALLTYPE GetIDsOfNames(refid-riid,ollechar-FAR*FAR*rgszNames,unsigned-int-cNames,LCID-LCID,DISPID-FAR*rgDispId){return NOERROR;}
HRESULT STDMETHODCALLTYPE调用(DISPID DISPID member、refid riid、LCID LCID、字wFlags、DISPPARAMS FAR*pDispParams、VARIANT FAR*pVarResult、EXCEPINFO FAR*pExcepInfo、unsigned int FAR*puArgErr)
{ 
//DISPID_DOCUMENTCOMPLETE:这是我们最早获得“文档”界面的地方
if(DISPID成员==DISPID\u文档完成)
{如果(!webBrowser)返回E_失败;
IDispatch*idisp;网络浏览器->获取文档(&idisp);
如果(idisp&&!doc)idisp->QueryInterface(IID_IHTMLDocument,(void**)和doc);
如果(idisp&&!doc2)idisp->QueryInterface(IID_IHTMLDocument2,(void**)和doc2);
if(doc2&&!win2)doc2->get_parentWindow(&win2);
IConnectionPointContainer*cpc=0;if(doc)doc->QueryInterface(IID_IConnectionPointContainer,(void**)和cpc);
i连接点*cp=0;如果(cpc)cpc->find连接点(DIID_HTMLDocumentEvents2,&cp);
DWORD cookie;HRESULT hr;if(cp)hr=cp->advice(static_cast(this))&cookie;
if(cp)cp->Release();if(cpc)cpc->Release();if(idisp)idisp->Release();
如果(!doc | | |!doc2 | | |!win2 | | hr!=S|u OK){release();return E|u FAIL;}
返回无错误;
}
if(DISPID成员==DISPID\u HTMLDOCUMENTEVENTS\u ONCLICK)
{//这显示了如何响应简单事件。
消息框(0,_T(“尝试按键盘上的一些键!”),_T(“BHO”),MB_OK);
返回无错误;
}
if(DISPID成员==DISPID\u HTMLDOCUMENTEVENTS\u ONKEYDOWN)
{//这显示了如何检查事件的“事件对象”
IDispatch*param1=0;如果(pDispParams->cArgs==1&&(pDispParams->rgvarg)[0]。vt==vt_调度)param1=(pDispParams->rgvarg)[0]。pdispVal;
IHTMLEventObj*pEvtObj=0;if(param1)param1->QueryInterface(IID_IHTMLEventObj,(void**)和pEvtObj);
long keycode;HRESULT hr;if(pEvtObj)hr=pEvtObj->get_keycode(&keycode);
如果(pEvtObj)pEvtObj->Release();
如果(!pEvtObj | hr!=S|u OK)返回E|u FAIL;
//这显示了如何操作元素的CSS样式
int i=keycode-32;if(i63)i=63;i*=4;
wchar_t buf[100];wsprintfW(buf,L“rgb(%i,%i,%i)”,i,255-i,i/2);
ihtmlement*body=0;doc2->get_body(&body);
IHTMLStyle*样式=0;如果(正文)正文->获取样式(&style);
变量v;v.vt=vt_BSTR;v.bstrVal=buf;
if(style)style->put_backgroundColor(v);
if(style)style->Release();if(body)body->Release();
如果(!body | |!style)返回E|u失败;
返回无错误;
}
返回无错误;
}
//IObjectWithSite。。。
HRESULT STDMETHODCALLTYPE GetSite(refid riid,void**ppvSite){返回E_NOINTERFACE;}
HRESULT STDMETHODCALLTYPE设置位置(IUnknown*iunk)
{//IE调用此命令,将我们插入当前的web窗口
释放();
iunk->QueryInterface(IID_IWebBrowser2,(void**)和webBrowser);
IConnectionPointContainer*cpc=0;iunk->QueryInterface(IID_IConnectionPointContainer,(void**)和cpc);
i连接点*cp=0;如果(cpc)cpc->find连接点(DIID_DWebBrowserEvents2,&cp);
DWORD cookie;HRESULT hr;if(cp)hr=cp->advice(static_cast(this))&cookie;
如果(!webBrowser | | |!cpc | |!cp | hr!=S|U OK){如果(cp)cp->Release();如果(cpc)cpc->Release();Release();返回E|U FAIL;}
返回S_OK;
}
//BHO。。。
BHO():ref(0),webBrowser(0),doc(0),doc2(0),win2(0){};
~BHO(){release();}
作废释放(){if(webBrowser)webBrowser->release();webBrowser=0;if(doc)doc->release();doc=0;if(doc2)doc2->release();doc2=0;if(win2)win2->release();win2=0;}
};
类MyClassFactory:公共IClassFactory
{long ref;
公众:
//IUnknown…(注意,这个类是静态实例化的,这就是为什么Release()不删除它。)
HRESULT STDMETHODCALLTYPE查询接口(refid riid,void**ppv){if(riid==IID_IUnknown | | riid==IID_IClassFactory){*ppv=this;AddRef();返回S_OK