使用MFC开发网页提取程序的经验总结

来源:互联网 发布:python日期比较大小 编辑:程序博客网 时间:2024/06/16 14:31

          最近开发了一个在网页内提取页面信息并发往后台进行处理的数据库,在开发的过程中遇到了一些问题,获得了一些经验,在此先感谢下CSDN上的大神的无私分享。

          在项目之初,想在一个程序的基础上修改,由于原来的代码是在vc6.0下写成的,而我的开发环境是vs2008,关于vc6.0下的项目转换成vs2008项目可能产生的问题以及解决方案如下:

                    http://blog.csdn.net/wangjiaoyu250/article/details/8810069

          在将vs转换之后,发现IHTMLDocument4无法找到,查找原因为sdk版本过低,vc6.0自带的sdk不支持IHTMLDocument3其以后的对象,因此需要升级sdk;下载并配置sdk的方法如下:http://blog.csdn.net/alvetjook/article/details/1444529;

         配置完之后,可以调整各路径与原有路径的前后次序,因为编译和连接的时候是按照顺序寻找相应的include和lib。为了保证用上最新的,你可以把路径放在原来的配置中vc6自带的sdk路径前面。如果把新加入的头文件.h和库文件.lib放到第一位置,这时候会抱一个错误,具体的错误提示没记录下来,网上找的解决方案如下:fatal error LNK1103: debugging information corrupt; recompile module的解决方案:http://blog.csdn.net/magictong/article/details/4725977

 把lib文件的位置下移,但这会引起另一个错误,原因在于他用的是新版sdk的头文件,但是首先使用的还是旧版sdk的cpp文件,导致错误,正确的解决方案的地址忘了,解决方法:
在网上找了很久,大伙都是讲的调试VC6工程时出现这个错误的情况。是要把Tool -> Options -> Directories(VC6是这个,VS的是Tools -> Options -> Projects and Solutions -> VC++ Directories),将Include files和Library files中SDK的顺序放到最下边或者直接删掉较新的SDK。此方法对我遇到的错误无效。
在微软网站找到这个http://support.microsoft.com/kb/974193/。说错误的原因是链接器(linker)的bug导致了这个错误的产生。要解决这个问题只要关闭工程的程序数据库(program database,PDB)文件的生成即可。操作如下:
在Solutions Explorer中选中工程,点右键选Properties -> Linker -> Debugging,把Generate Debug Info选项改为No.这样就OK了。http://blog.csdn.net/duanjingneuq/article/details/5588050

 

       由于转换的项目存在一些因为转换和兼容性导致的烦人问题,决定改用vs2008重写。

      1,如何在创建托盘程序

      在OnInitDialog()函数中添加如下代码

//添加系统托盘wenzi2013 0705

CString title;
 title.Format("页面信息提取比对系统");

char lpszTip[256];
 strcpy_s(lpszTip,255,(char *)(LPCTSTR)title);
 NOTIFYICONDATA data;
 data.cbSize = sizeof(NOTIFYICONDATA);
 data.hWnd   = m_hWnd;
 strcpy(data.szTip,lpszTip);
 data.uCallbackMessage = WM_ONTRAY;
 data.uFlags           = NIF_MESSAGE | NIF_ICON | NIF_TIP;
 m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
 data.hIcon            = m_hIcon;
 data.uID              = IDI_ICON1;
 Shell_NotifyIcon(NIM_ADD,&data);

     2,CString转换到数组

      添加上述托盘之后,会发现托盘的标题后面给了很多乱码,这主要是由于编码的不同导致的,解决方法如下:

    http://blog.csdn.net/zzyoucan/article/details/8500699

    3,如何在菜单中加入图标

    //对菜单项加入图标 wenzi20130707
CBitmap *pMenuBitmap/*,*pMenuBitmapun*/;
 pMenuBitmap = new CBitmap;
  pMenuBitmap->LoadBitmap(IDB_BITMAP1);//需要加载的图标资源
 CMenu *pchildMenu; 
 pchildMenu = m_Menu.GetSubMenu(0);//子菜单,0代表主菜单的第一个子菜单 
 pchildMenu->SetMenuItemBitmaps(0,MF_BYPOSITION| MF_STRING| MF_ENABLED,pMenuBitmap, pMenuBitmap);

 

    4,托盘处理函数OnTray

OnTray(WPARAM wParam, LPARAM lParam)//托盘处理函数 wenzi20130705
{
 UINT uMouseMsg = (UINT) lParam;
 if(uMouseMsg == WM_RBUTTONDOWN)
 {
  CMenu* pPopup = m_Menu.GetSubMenu(0);
  CPoint point;
  GetCursorPos(&point);
  pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_VERTICAL,
   point.x,point.y,AfxGetApp()->m_pMainWnd,TPM_LEFTALIGN);   
 }
 if(uMouseMsg == WM_LBUTTONDBLCLK)     //双击鼠标
 {
  if(m_bFlag)
  {
   ShowWindow(SW_HIDE); //隐藏窗口的显示 wenzi20130718 
   m_bFlag=!m_bFlag;
   m_Menu.GetSubMenu(0)->CheckMenuItem(ID_HideWindow,MF_CHECKED|MF_BYCOMMAND);
   
   //修改菜单项的标题

  }
  else
  {
   ShowWindow(SW_SHOWNOACTIVATE);    //恢复窗口的显示 
   m_bFlag=!m_bFlag;
   m_Menu.GetSubMenu(0)->CheckMenuItem(ID_HideWindow,MF_UNCHECKED|MF_BYCOMMAND );

  }
  
 }
 return NULL ;//wenzi 20130704
}

 5,托盘系统的关闭函数OnClose

 

void CIEInputMonitor_vcDlg::OnClose()
{
 // TODO: Add your message handler code here and/or call default

 // wenzi 20130705
 if(MessageBox(_T("确认要退出审核校验系统吗?"),_T("系统提示"),MB_OKCANCEL|MB_ICONQUESTION)!=IDOK)
  return;
 //删除系统托盘
 NOTIFYICONDATA data;
 data.cbSize = sizeof(NOTIFYICONDATA);
 data.hWnd   = m_hWnd;
 Shell_NotifyIcon(NIM_DELETE,&data);
 CDialog::OnClose();
}

在此请教一个问题,当我在OnExit()中直接调用OnClose无法关闭窗口,我大概知道是消息的发送和处理机制导致的,想知道详情,有知道的大神望不吝赐教。

 6,如何拖动无标题栏的对话框

 一种方法;http://blog.csdn.net/dreamlins/article/details/5810155

不过这种方式比较麻烦;

另一种方式是:在PreTranslateMessage(MSG* pMsg)函数中,加入以下代码:

PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 CPoint point;
 GetCursorPos(&point);
 if(pMsg->message == WM_LBUTTONDOWN && pMsg->hwnd == m_hWnd)
 {
  PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));//保证无边框时能被鼠标拖动 wenzi20130717
 }
 return CDialog::PreTranslateMessage(pMsg);
}

或者在OnLbuttondown中加入

 PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

7 ,Tab Control控件的使用

http://www.cnblogs.com/lzmfywz/archive/2012/04/07/2436571.html

    8,如何修改窗口的背景

    添加OnEraseBkgnd(CDC* pDC)函数;

   

OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 CDialog::OnEraseBkgnd(pDC);
 CRect RDlg;
 GetClientRect(&RDlg);
   //CDC* pDC = GetDC();
 pDC->SetBkMode(TRANSPARENT);
 CBitmap DlgBK;
 DlgBK.LoadBitmap(IDB_BACKGROUND);//采用位图拉升平铺的方法设置背景 wenzi20130717
 BITMAP Size;
 DlgBK.GetBitmap(&Size);
 CDC memdc;
 memdc.CreateCompatibleDC(pDC);
 memdc.SelectObject(&DlgBK);
 pDC->StretchBlt(RDlg.left,RDlg.top,RDlg.right,RDlg.bottom,&memdc,0,0,Size.bmWidth,Size.bmHeight,SRCCOPY);
 DlgBK.DeleteObject();


 return TRUE;
}

  在此处采用了双缓存来加载背景,防止窗口可能出现的闪烁,关于闪烁和双缓存。

http://blog.csdn.net/woyaowenzi/article/details/1823842

   在此处个人觉得把代码放在OnPaint中也可以,不过要放在CDialog::OnPaint()之前;不然会出现背景遮盖控件的情况。

9 如何设置控件背景为透明

http://blog.sina.com.cn/s/blog_673ccb5b01010uwr.html

http://www.cnblogs.com/emyueguang/archive/2011/05/24/2055198.html

http://blog.csdn.net/wzy198852/article/details/7108608

http://bbs.csdn.net/topics/390401008?page=1

 上述方法还是会存在一些重影的问题,如果要求不高,可以接受。

  10,如何更改Tab空间的背景和标题

http://support.microsoft.com/kb/179909

这种方法我用了不太成功,我想设置一个位图背景,在切换选项卡时会出现背景遮盖了控件上的标题。调整的方法是:

派生自己的tabcontrol类,重载

BOOL CMyTabCtrl::OnEraseBkgnd(CDC* pDC)
{
 // TODO: Add your message handler code here and/or call default
 CTabCtrl::OnEraseBkgnd(pDC);
 
 CRect RDlg;
 GetClientRect(&RDlg);
 RDlg.InflateRect(2,0);
 
  //CBitmap DlgBK;//采用位图拉升平铺的方法设置背景 wenzi20130717
  CDC memdc;
  memdc.CreateCompatibleDC(pDC);
  HBITMAP holdBMP=(HBITMAP)memdc.SelectObject(&m_hBK);
  pDC->SetBkMode(TRANSPARENT);

  BITMAP Size;
  m_hBK.GetBitmap(&Size);
  pDC->StretchBlt(RDlg.left,RDlg.top,RDlg.right,RDlg.bottom,&memdc,0,0,Size.bmWidth,Size.bmHeight,SRCCOPY);
  memdc.SelectObject(holdBMP);


 return TRUE;
}

通过该函数设置tab控件的背景,

再重载

void CMyTabCtrl::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct)//主要用来设置tab控件的标签标题。
{
 ;
  TC_ITEM     tci;
  CString     szTabText;

  switch (lpDrawItemStruct->itemID)
  {
  case 0:
   szTabText=_T("发票验旧");
   //DrawTabItem(lpDrawItemStruct);
   break;
  case 1:
   szTabText=__T("数据审核");
   //DrawTabItem(lpDrawItemStruct);
   break;
  case 2:
   szTabText=__T("发票销售");
   //DrawTabItem(lpDrawItemStruct);
   break;
  }

 

  CDC *dc = CDC::FromHandle(lpDrawItemStruct->hDC);
  //dc->SetBkColor(RGB(233,136,220));
  dc->SetBkMode(TRANSPARENT);//设置dc的背景为透明 wenzi20130718
  dc->SetTextColor(RGB(255,0,0));
 
  tci.mask        = TCIF_TEXT;
  tci.pszText     = szTabText.GetBuffer();
  tci.cchTextMax  = sizeof(szTabText)-1;
  GetItem(lpDrawItemStruct->itemID, &tci);
  //TextOut(lpDrawItemStruct->hDC,lpDrawItemStruct->rcItem.left,lpDrawItemStruct->rcItem.top,tci.pszText,lstrlen(tci.pszText));
  dc->DrawText(tci.pszText,&(lpDrawItemStruct->rcItem),DT_SINGLELINE|DT_VCENTER|DT_CENTER);
 
}实现tab控件的标题。

 11 如何在程序初次启动时隐藏窗口

http://blog.csdn.net/miromelo/article/details/5450460

http://hi.baidu.com/sky_lixf/item/8c00998c00d92fcaee083da8

给人觉的下面方法比较好用,加载OnNcPaint,

OnNcPaint()//初始隐藏窗口
{
 // TODO: Add your message handler code here
 // Do not call CDialog::OnNcPaint() for painting messages
 static int i = 2;
 if(i > 0)
 {
  i --;
  ShowWindow(SW_HIDE);
 }
}

 

    12,按回车时直接关闭应用程序的问题

http://blog.csdn.net/citysheep/article/details/5987969

加载OnGetDefID函数

LRESULT CIEInputMonitor_vcDlg::OnGetDefID(WPARAM wp, LPARAM lp)
{
 return MAKELONG(0,DC_HASDEFID);
}

 

    13,解决VC提示 syntax error : identifier 'LONG_PTR'错误的方法

       http://blog.csdn.net/gylxxz86/article/details/6287848

 

    14 ,如何获取浏览器对象

   需要包含一下头文件或者动态库

#pragma comment(lib,"Wininet.lib")

#import <shdocvw.dll>

#include <afxinet.h>

#include <Wininet.h>

#include<mshtml.h>

 

CoInitialize(NULL);  
 //SHDocVw::IShellWindowsPtr m_spSHWinds; //将此处变量改为类的成员变量 wenzi 20130724
 if (m_spSHWinds == NULL)
    {    
  if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK) 
  {       //  MessageBox(L"Failed");  
   CoUninitialize(); 
   return FALSE ;//nRelNum;    
  } 
 }  
 long nCount = m_spSHWinds->GetCount();
    IDispatchPtr spDisp;
 IHTMLDocument2* pIHTMLDocument2Result=NULL;
 for (long i = 0; i < nCount; i++)  
 { 
  if(NULL!=pIHTMLDocument2Result)
   break;
  _variant_t va(i, VT_I4);
  spDisp = m_spSHWinds->Item(va);  
  SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);  
  if (spBrowser != NULL)  //查找目标程序wenzi20130708
  {       
   IDispatchPtr spDisp;
   if(spBrowser->get_Document(&spDisp) == S_OK && spDisp != 0 ) 
   {                
    CComQIPtr<IHTMLDocument2> pDoc;      
    spDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
    if(pDoc==NULL)      
    {                    
     continue;      
    }
           return TRUE;

   }
  } 

 }
 CoUninitialize();  
    return FALSE ;

   15 如何判断也页面是否打开

 

BOOL HTMLProcess::IsReady(IHTMLDocument2* sDoc)   // 检查网页状态是否为 complete
{
  BSTR bstrUrl=NULL;
 HRESULT hr = sDoc->get_readyState(&bstrUrl);
 LPTSTR  psz3 ;
 USES_CONVERSION;
 psz3 =OLE2T(bstrUrl);
 LPTSTR   psz4 =_T("complete");
 if ( *psz3 == *psz4) 
 {
  return True;
 }
 return false ;
}

16 如何判断页面是否有焦点

 VARIANT_BOOL  HTMLProcess::DocHasFocus(IHTMLDocument2* sDoc)
{
 CComPtr<IHTMLDocument4>spDocEvent=NULL;
 VARIANT_BOOL  presult=VARIANT_FALSE;
 HRESULT hr  = sDoc->QueryInterface(IID_IHTMLDocument4,(void**)&spDocEvent);
 HRESULT hr1 =  spDocEvent->hasFocus(&presult);
 if(FAILED(hr1)) return VARIANT_FALSE;
 return presult;
}

   通过此方式判断页面是否有焦点只能判断主页面是否有焦点,但不能判断主页面某个子页面是否有焦点。

 

17   如何查找目标URL

bool HTMLProcess::IsFind(IHTMLDocument2* pIHTMLDocument2, CString& cTarget)
{
 if(pIHTMLDocument2==NULL) return false;
 BSTR ctaisbstrUrl= NULL ;//获取URL wenzi20130710
 CString cCurFrame="";//当前窗口URL
 LRESULT hr = pIHTMLDocument2->get_URL(&ctaisbstrUrl);//判断是否为目标程序地址 wenzi20130708
 if ( FAILED( hr ) )   return FALSE;
 cCurFrame=ctaisbstrUrl;
 int iPage=cCurFrame.Find(cTarget);
 if(-1!=iPage)
  return true;
 return false;
}

 18 如何遍历页面元素

    HRESULT hr;//获取窗口中的表单元素
    long i=0;
     CComQIPtr<IHTMLElementCollection> pElementCollection;
     //CComQIPtr<IDispatch> pEnumElement;
     //CComQIPtr<IHTMLElement> pElement;
     BSTR EmName=NULL;
     /*BSTR EMId;*/
     VARIANT EMAttribute;
    BSTR strAttribute;
      CString Ctemp="";
       CString ctargetbtn="btn_cancle";
     strAttribute=SysAllocString(L"name");
     hr=ctaisfrspDoc2->get_all(&pElementCollection);
     if(FAILED(hr))return false;
     if(pElementCollection)
     {
     pElementCollection->get_length(&i);
     for(;i>0;i--)
     {
     _variant_t vb(VT_EMPTY);
       _variant_t va(i,VT_I4);
       CComQIPtr<IDispatch> pEnumElement;
      CComQIPtr<IHTMLElement> pElement;
      hr=pElementCollection->item(va,vb,&pEnumElement);
       if(FAILED(hr)) continue;
       if(pEnumElement)
      {
       pEnumElement->QueryInterface(IID_IHTMLElement,(void**)&pElement);
       if(pElement)
       {
        pElement->get_id(&EMId);
        Ctemp=EMId;
         if(-1!=Ctemp.Find(ctargetbtn))
          
//         MessageBox(NULL,Ctemp,NULL,MB_OKCANCEL);
       pElement->get_tagName(&EmName);
         //Ctemp=EmName;
        //MessageBox(NULL,Ctemp,NULL,MB_OKCANCEL);
        //pElement->getAttribute(strAttribute,0,&EMAttribute);
        //Ctemp=EMAttribute.bstrVal;
         //MessageBox(NULL,Ctemp,NULL,MB_OKCANCEL)

       }
       }
     }
 
    }

    19 如何在MFC中通过msscript 调用java script

 http://www.myexception.cn/vb/557924.html

 

在头文件stdafx.h中添加

#import "msscript.ocx" /*raw_interfaces_only, raw_native_types,*/ no_namespace, named_guids \
 rename("Error", "ScriptError")

Script 的调用接口

CString HTMLProcess::ScriptCtrFunc(IHTMLDocument2 *  pIHTMLDocument2, _bstr_t ScriptCode)
{
 IScriptControlPtr pScriptControl(__uuidof(ScriptControl));

 // Create a VARIANT array of VARIANTs which hold BSTRs
 LPSAFEARRAY psa;
 SAFEARRAYBOUND rgsabound[]  = { 3, 0 }; // 3 elements, 0-based
 int i;

 psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
 if (!psa)
 {
  //return E_OUTOFMEMORY;
 }

 VARIANT vFlavors[3];
 for (i = 0; i < 3; i++)
 {
  VariantInit(&vFlavors[i]);
  V_VT(&vFlavors[i]) = VT_BSTR;
 }

 V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"));
 V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"));
 V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip"));

 long lZero = 0;
 long lOne = 1;
 long lTwo = 2;

 // Put Elements to the SafeArray:
 SafeArrayPutElement(psa, &lZero,&vFlavors[0]);
 SafeArrayPutElement(psa, &lOne,&vFlavors[1]);
 SafeArrayPutElement(psa, &lTwo,&vFlavors[2]);

 // Free Elements from the SafeArray:
 for(i=0;i<3;i++)
 {
  SysFreeString(vFlavors[i].bstrVal);
 }
 if(pIHTMLDocument2==NULL)return CString();

 // Set up Script control properties
 CComQIPtr<IHTMLWindow2>  pWin;
 //CComQIPtr<IHTMLDocument2> pIHTMLParent;
 pIHTMLDocument2->get_parentWindow(&pWin);
//  pWin->get_document(&pIHTMLParent);
//  pIHTMLParent->get_parentWindow(&pWin);

 //pScriptControl->Language="JScript";
 pScriptControl->Language = "JScript";
 pScriptControl->AllowUI = TRUE;
 pScriptControl->AddCode(ScriptCode);
 pScriptControl->AddObject("document", pWin, VARIANT_TRUE);
 pScriptControl->AddObject("window", pWin, VARIANT_TRUE);
 //BSTR URL1 = NULL;
 //pIHTMLDocument2->get_URL(&URL1);
 //  Call MyStringFunction with the two args:
 _variant_t outpar = pScriptControl->Run("MyStringFunction", &psa);
//  if(NULL==outpar)
//   return CString();

 // Convert VARIANT to C string:
 _bstr_t bstrReturn = (_bstr_t)outpar;
 char *pResult = (char *)bstrReturn;
 CString strResult;
 strResult.Format("%s",pResult);
 return strResult;

 return CString();
}

因为本人有点懒,所以进没太改动了,借口可以根据自己需要改动。对借口的调用格式如下

CSting GetValue_fwskrzprint="";

GetValue_fwskrzprint  = ScriptCtrFunc(ctaisfrspDoc2,"function MyStringFunction(Argu1,Argu2,Argu3){var s='test',return s ; }");

 

20 ,如何获取页面表单的对象

        在script中,需要获取页面表单中的元素对象,可采用如下方式:

       var target=document.tab_fp.all.frm_yj.contentWindow.document.getElementById('dw_yj');

       通常的页面对象的层次为窗口(window),文档(document),元素(elements),因此通过窗口来获取文本,通过文本来获得元素对象,元素对象在通过contentWindow来与起窗口连接起来。

       

21 ,如何查找浏览中的提示窗口

  CString HTMLProcess::SeachTipIEFrame(void)//查找弹出的提示窗口
{
 CString textvalue="";
 HWND hParent=NULL,hChild=NULL;
 hParent=FindWindow("Internet Explorer_TridentDlgFrame",NULL);
 if(NULL==hParent)
  return CString();
 hChild=FindWindowEx(hParent,NULL,"Internet Explorer_Server",NULL);
 textvalue=GetFrameContent(hChild);
 //MessageBox(NULL,textvalue,NULL,MB_OKCANCEL);
 return textvalue;
}

   该函数存在概率问题,有时候可能会失败,可以通过循环解决。

  22,如何获取Internet Explorer_Server中的内容

http://bbs.csdn.net/topics/50477579

http://blog.163.com/lhj20020427@126/blog/static/1048183402010630113831924/

http://blog.163.com/wanggc_cz/blog/static/5538605520082713831309/

 

CString HTMLProcess::GetFrameContent(HWND hwnd)//获取弹出网页对话框中的内容  wenzi20130724
{
 if (hwnd == NULL)
 {
  //MessageBox(NULL,_T("窗口句柄为空"),0,0);
  return CString();
 }
 LRESULT ctaisdwRes;
 HRESULT ctaisforhr;
 IHTMLElement *ctaispHtmlElement;
 CString URL;
 HINSTANCE ctaishInst = ::LoadLibrary( _T("OLEACC.DLL") );

 UINT SBfwskcbnMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
 ::SendMessageTimeout(hwnd, SBfwskcbnMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&ctaisdwRes);
 LPFNOBJECTFROMLRESULT ctaispfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( ctaishInst,"ObjectFromLresult");
 if ( ctaispfObjectFromLresult != NULL )
 {    
  //MessageBox(0,"find the ObjectFrom",0,0);
  HRESULT ctaishr;
  CComPtr<IHTMLDocument2> ctaisspDoc=NULL;
  ctaishr=ctaispfObjectFromLresult(ctaisdwRes,IID_IHTMLDocument2,0,(void**)&ctaisspDoc);
  if ( SUCCEEDED(ctaishr) )
  {
   //MessageBox(0,"success",0,0);
   ctaisforhr=ctaisspDoc->get_body(&ctaispHtmlElement); //打印源文件
   BSTR ctaisbstrUrl;
   CString ctaisstrurl= "";
   ctaispHtmlElement->get_innerText(&ctaisbstrUrl);
   URL = (CString)ctaisbstrUrl;
   //MessageBox(0,URL.Mid(1086,8),0,0);
  }
  //else MessageBox(0,_T("craishr is failed"),0,0);
 }
 //else MessageBox(0,_T("ctaispfObjectFromLresult is NULL"),0,0);
 ::FreeLibrary(ctaishInst);
 return URL;
 return CString();
}

  23,MFC实现发送消息到服务器

http://blog.csdn.net/playstudy/article/details/8264159

http://blog.csdn.net/kmblack1/article/details/8048413
http://blog.csdn.net/segen_jaa/article/details/6705340

http://blog.csdn.net/rrrfff/article/details/7340074

http://blog.csdn.net/dragoo1/article/details/7800249

http://blog.csdn.net/centralperk/article/details/6435889

http://aixiangct.blog.163.com/blog/static/9152246120114593259152/

  http://blog.sina.com.cn/s/blog_49b531af0102e84i.html 

 

bool HTMLProcess::UploadFromServer(CString Url,CString& ObjectRecv,CString& ObjectSend)
{
 bool ret=false;
 CInternetSession Sess(_T("session"));    
 Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT     , 500); //2秒的连接超时    
 Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT        , 500); //2秒的发送超时    
 Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT     , 500); //2秒的接收超时    
 Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT   , 500); //2秒的发送超时    
 Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 500); //2秒的接收超时

// DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;      
 CHttpFile* pFile   = NULL;
 CString Host="";
 CString CPort="";
 CString CTargetObject="";
 int iLocationHostlength=0;
 iLocationHostlength=8+m_host.GetLength()+m_CPort.GetLength();
 CTargetObject=Url.Right(Url.GetLength()-iLocationHostlength);//若URL地址的格式有所变化,可能需要对此处的数据进行修改  wenzi20130722
 Host=Url.Left(iLocationHostlength);
 CPort=Host.Right(m_CPort.GetLength());
 Host=Url.Left(iLocationHostlength-m_CPort.GetLength()-1);
 Host=Host.Right(iLocationHostlength-m_CPort.GetLength()-8);
 CHttpConnection*   pServer   =   NULL;
 CString LengthStr="";
 INTERNET_PORT   nPort;
 nPort=atoi(CPort.GetBuffer());
 int     nBufLen = 0   ;
 BOOL bConnect=FALSE;
 do {        
  try    
  {
   pServer   =   Sess.GetHttpConnection(Host,nPort);
   //cFile = (CHttpFile*)Sess.OpenURL(Url,1,dwFlag); //含特殊字符导致执行失败。wenzi20130716
   pFile=pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST,CTargetObject,NULL,1,NULL,NULL,INTERNET_FLAG_EXISTING_CONNECT);
   
   //向请求中添加参数 wenzi30130722

   Flag=itoa(m_bdelFlag,Flag.GetBufferSetLength(4),10);

   LengthStr = "dx="+ObjectSend+"&sfscbz="+Flag;///需要传到服务器的参数写入此字符串 wenzi 20130724


   pFile->AddRequestHeaders(_T("POST"+CTargetObject+"HTTP/1.1"));
   pFile->AddRequestHeaders(_T("Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"));
   pFile->AddRequestHeaders(_T("Referer:"+Url));//http://91.16.17.195:8802/Test111/GetFpyjdysbServlet?nsrsbh=330323196603190312&tjyf=201201
   pFile->AddRequestHeaders(_T("Accept-Language: zh-cn"));
   pFile->AddRequestHeaders(_T("Content-Type: application/x-www-form-urlencoded"));//charset=UTF-8
   pFile->AddRequestHeaders(_T("Accept-Encoding: gzip, deflate"));
   pFile->AddRequestHeaders(_T("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"));
   pFile->AddRequestHeaders(_T("Host: "+Host+":"+CPort));
   //pFile->AddRequestHeaders(_T("Content-Length:" /*+ payload.Length*/));
   pFile->AddRequestHeaders(_T("Connection: Keep-Alive"));//Keep-Alive或者close;
   pFile->AddRequestHeaders(_T("Cache-Control: no-cache"));
   
   
   bConnect=pFile->SendRequest(NULL,0,(LPVOID)(LPCSTR)LengthStr,LengthStr.GetLength());
   if(!bConnect)//连接是否成功
   {
    MessageBox(NULL,"网络连接失败,请检查网络!","友情提示",MB_OK);
   }

   DWORD dwStatusCode;
   CString strLine;
   pFile->QueryInfoStatusCode(dwStatusCode);            
   if (dwStatusCode == HTTP_STATUS_OK)
   {                 //查询文件长度               
    int nLen=0;
    while ((nLen = pFile->ReadString(strLine))>0)
    {
     ObjectRecv+=strLine;
    }
    ret = true;            
   }
   pFile->Close();
   pServer->Close();
   Sess.Close();

   //MessageBox(NULL,"网络连接失败,请检查网络!","友情提示",MB_OK);
  }
  catch(...)
  {            
   break;//        
  }    
 } while(0);
 if(bConnect&(!ret))//数据是否正确
 {
  MessageBox(NULL,"数据错误,请检查数据!","友情提示",MB_OK);
 }
 return ret;  

}

cFile = (CHttpFile*)Sess.OpenURL(Url,1,dwFlag); //含特殊字符导致执行失败。wenzi20130716

http://blog.csdn.net/lzyzuixin/article/details/4060173

pFile->Close();
   pServer->Close();
   Sess.Close();必须写明,否则会导致请求过慢的现象,大概要十几秒才能完成一次请求操作。

24 ,HttpWebRequest发送post请求时有多个参数如何处理?

        http://bbs.csdn.net/topics/390170894

       在此主要注意参数的格式,在23中已经实现了对多个参数的发送。

25   解决VC提示 syntax error : identifier 'LONG_PTR'错误的方法

     http://blog.csdn.net/gylxxz86/article/details/6287848

26   error C2471: cannot update program database vc90.pdb

http://www.cnblogs.com/kex1n/archive/2012/01/14/2322164.html

27 关于报错“\crl”的处理方法

http://www.cnblogs.com/feiweiwei/archive/2008/12/18/966235.html

    按上面的方法改有时会出现一些告警,通常选择选择(/clr)就行。

 最后,程序在使用中会出现退出现象,原因是对出现的异常未加处理,可在可能出现异常的代码添加try{可能产生异常的代码段}catch(...){此处添加处理代码;}

 

 

      

 

 

       

       

原创粉丝点击