月度归档: 2015 年 10 月

  • 配置wireshark只抓HTTP包

    wireshark只抓HTTP包 http and tcp.port == 80

  • delphi7使用idhttp获取https的页面代码

    delphi7使用idhttp获取https的页面代码

    procedure TForm1.Button1Click(Sender: TObject);
    var url:string;
    response:TStringStream;
    error:string;
    begin
      response:=TStringStream.Create('');
      IdHTTP1.IOHandler := IdSSLIOHandlerSocket1;
      IdHTTP1.HandleRedirects:=false;
      IdSSLIOHandlerSocket1.SSLOptions.Method := sslvSSLv3;
      url:='https://passport.jd.com/new/login.aspx';
      try
        IdHTTP1.Get(url);
      except
        on E: Exception do
          error:=E.Message;
      end;
      url:= IdHTTP1.Response.Location;
      if error='HTTP/1.1 302 Found' then
      begin
        IdHTTP1.Get(url,response);
        Memo1.Text := response.DataString;
      end;
    
    
      response.Free;
    end;

    需要把下面两个dll和exe放在一起

    注意:不要在delphi ide中按F9运行, 这样(try except)异常会被IDE的调试器捕获,当然可以设置忽略异常,把异常传递给程序,不过并不推荐这样做,会影响下次调试。

    看效果直接双击exe即可。

  • VC确保存路径存在在,如果不存在则创建

    void MakeSureDirExist(const char * pPath )
    {
            if ( pPath == NULL)
                   return;
           std:: string strPath( pPath);
           
            if (strPath.at(strPath.length() - 1) != '\\')
                  strPath += '\\';
    
            int len = strPath.length();
            for( int i =0; i < len; ++i)
           {
                   if(strPath[i]== '\\')
                  {
                         :: CreateDirectory((strPath.substr(0, i)).c_str(), NULL );
                  }
           }
    
    }
  • std::string 常用函数

    std::string 常用函数

    string replace(const string & str , const string & src , const string & dest )
    {
            string ret;
           
            string:: size_type pos_begin = 0;
            string:: size_type pos       = str.find( src);
            while (pos != string::npos)
           {
                  cout << "replacexxx:" << pos_begin <<" " << pos <<"\n";
                  ret.append( str.data() + pos_begin, pos - pos_begin);
                  ret += dest;
                  pos_begin = pos + 1;
                  pos       = str.find( src, pos_begin);
           }
            if (pos_begin < str.length())
           {
                  ret.append( str.begin() + pos_begin, str.end());
           }
            return ret;
    }
    
    int split(const string & str , vector <string >& ret_, string sep = ",")
    {
            if ( str.empty())
           {
                   return 0;
           }
           
            string tmp;
            string:: size_type pos_begin = str.find_first_not_of( sep);
            string:: size_type comma_pos = 0;
           
            while (pos_begin != string::npos)
           {
                  comma_pos = str.find( sep, pos_begin);
                   if (comma_pos != string::npos)
                  {
                         tmp = str.substr(pos_begin, comma_pos - pos_begin);
                         pos_begin = comma_pos + sep.length();
                  }
                   else
                  {
                         tmp = str.substr(pos_begin);
                         pos_begin = comma_pos;
                  }
                  
                   if (!tmp.empty())
                  {
                          ret_.push_back(tmp);
                         tmp = "";
                  }
           }
            return 0;
    }
    
    
    string trim(const string & str )
    {
            string:: size_type pos = str.find_first_not_of( ' ');
            if (pos == string::npos)
           {
                   return str;
           }
            string:: size_type pos2 = str.find_last_not_of( ' ');
            if (pos2 != string::npos)
           {
                   return str.substr(pos, pos2 - pos + 1);
           }
            return str.substr(pos);
    }
    
  • VC为RichTextBox添加右键菜单

    VC为RichTextBox添加右键菜单

    private void InitRichTextBoxContextMenu(RichTextBox textBox)
    {
        //创建剪切子菜单
        var cutMenuItem = new MenuItem( "剪切");
        cutMenuItem.Click += (sender, eventArgs) => textBox.Cut();
    
        //创建复制子菜单
        var copyMenuItem = new MenuItem( "复制");
        copyMenuItem.Click += (sender, eventArgs) => textBox.Copy();
    
        //创建粘贴子菜单
        var pasteMenuItem = new MenuItem( "粘贴");
        pasteMenuItem.Click += (sender, eventArgs) => textBox.Paste();
    
        //创建右键菜单并将子菜单加入到右键菜单中
        var contextMenu = new ContextMenu();
        contextMenu.MenuItems.Add(cutMenuItem);
        contextMenu.MenuItems.Add(copyMenuItem);
        contextMenu.MenuItems.Add(pasteMenuItem);
    
        textBox.ContextMenu = contextMenu; //为richtextbox设置菜单
    }
  • VC 获取跳转后的网址

    VC 获取跳转后的网址

    BOOL GetRedirectUrl(std::string strUrl , string &redirectUrl )
    {
    
           
        //定义变量 
        HINTERNET hInet = NULL; //打开internet连接handle 
        HINTERNET hConnect = NULL; //HTTP连接 
        HINTERNET hRequestHead = NULL; //HTTP Request 
        HINTERNET hRequestGet = NULL; //HTTP Request 
        HANDLE hFileWrite = NULL; //写文件的句柄 
        char* pBuf = NULL; //缓冲区 
        DWORD dwRequestTryTimes = MAX_DOWNLOAD_REQUEST_TIME; //尝试请求的次数 
        DWORD dwDownBytes = 0; //每次下载的大小 
        DWORD dwDownFileTotalBytes = 0; //下载的文件总大小 
        DWORD dwWriteBytes = 0; //写入文件的大小 
        char bufQueryInfo[ LEN_OF_BUFFER_FOR_QUERYINFO] = {0}; //用来查询信息的buffer 
        DWORD dwBufQueryInfoSize = sizeof(bufQueryInfo); 
        DWORD dwStatusCode = 0; 
        DWORD dwContentLen = 0; 
        DWORD dwSizeDW = sizeof( DWORD); 
           
        //分割URL 
        CHAR pszHostName[ INTERNET_MAX_HOST_NAME_LENGTH] = {0}; 
        CHAR pszUserName[ INTERNET_MAX_USER_NAME_LENGTH] = {0}; 
        CHAR pszPassword[ INTERNET_MAX_PASSWORD_LENGTH] = {0}; 
        CHAR pszURLPath[ INTERNET_MAX_URL_LENGTH] = {0}; 
        CHAR szURL[INTERNET_MAX_URL_LENGTH] = {0}; 
        URL_COMPONENTSA urlComponents = {0}; 
        urlComponents.dwStructSize = sizeof( URL_COMPONENTSA); 
        urlComponents.lpszHostName = pszHostName; 
        urlComponents.dwHostNameLength = INTERNET_MAX_HOST_NAME_LENGTH; 
        urlComponents.lpszUserName = pszUserName; 
        urlComponents.dwUserNameLength = INTERNET_MAX_USER_NAME_LENGTH; 
        urlComponents.lpszPassword = pszPassword; 
        urlComponents.dwPasswordLength = INTERNET_MAX_PASSWORD_LENGTH; 
        urlComponents.lpszUrlPath = pszURLPath; 
        urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH; 
           
        BOOL bRet = InternetCrackUrlA( strUrl.c_str(), 0, NULL, &urlComponents); 
        bRet = (bRet && urlComponents.nScheme == INTERNET_SERVICE_HTTP); 
        if (!bRet) 
        { 
            goto _END_OF_DOWNLOADURL; 
        } 
           
        //打开一个internet连接 
        hInet = InternetOpenA( DOWNHELPER_AGENTNAME, INTERNET_OPEN_TYPE_PRECONFIG , NULL, NULL , NULL ); 
        if (!hInet) 
        { 
            bRet = FALSE; 
            goto _END_OF_DOWNLOADURL; 
        } 
           
        //打开HTTP连接 
        hConnect = InternetConnectA(hInet, pszHostName, urlComponents.nPort, pszUserName, pszPassword, INTERNET_SERVICE_HTTP , 0, NULL ); 
        if (!hConnect) 
        { 
            bRet = FALSE; 
            goto _END_OF_DOWNLOADURL; 
        } 
           
        //创建HTTP request句柄 
        if (urlComponents.dwUrlPathLength !=  0) 
            strcpy(szURL, urlComponents.lpszUrlPath); 
        else 
            strcpy(szURL, "/"); 
           
        //请求HEAD,通过HEAD获得文件大小及类型进行校验 
        hRequestHead = HttpOpenRequestA(hConnect, "HEAD", szURL, "HTTP/1.1" , "" , NULL , INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_AUTO_REDIRECT , 0); 
    
    
        bRet = FALSE; 
         dwStatusCode = 0; 
         dwSizeDW = sizeof(DWORD); 
     
            //发送请求 
            bRet = HttpSendRequestA(hRequestHead, NULL, 0, NULL, 0); 
            if (!bRet) 
            { 
                         bRet = FALSE;
                          goto _END_OF_DOWNLOADURL;
       
            } 
            else 
            { 
                //判断HTTP返回的状态码 
                dwStatusCode = 0; 
                dwSizeDW = sizeof( DWORD); 
                bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_FLAG_NUMBER | HTTP_QUERY_STATUS_CODE, &dwStatusCode, &dwSizeDW, NULL ); 
                if (bRet) 
                { 
                    //检查状态码 
                    if ( HTTP_STATUS_OK == dwStatusCode) //200 OK 
                    { 
                                      bRet = FALSE;
                                       goto _END_OF_DOWNLOADURL;
                       
                    } 
                                else if (302 == dwStatusCode)
                               {
                                       //GetStatusCode(hRequest);
                                       TCHAR szBuffer[ INTERNET_MAX_URL_LENGTH] = {0};
                                       DWORD dwLen = sizeof(szBuffer);
                                      
                                       // 获取HTTP请求信息(HTTP_QUERY_LOCATION获取的绝对URL在Location应答头)
                                       BOOL bRet = HttpQueryInfo(hRequestHead, HTTP_QUERY_LOCATION, szBuffer, &dwLen, NULL );
                                      
                                       redirectUrl = szBuffer;
                                       goto _END_OF_DOWNLOADURL;
                                      bRet = TRUE;
                               }
                    else 
                    { 
                        bRet = FALSE;  
                    } 
                } 
            }
    
                   //清理 
    _END_OF_DOWNLOADURL: 
                   if ( INVALID_HANDLE_VALUE != hFileWrite) 
                         CloseHandle(hFileWrite); 
                   if (pBuf) 
                          delete [] pBuf; 
                   if (hRequestGet) 
                         InternetCloseHandle(hRequestGet); 
                   if (hRequestHead) 
                         InternetCloseHandle(hRequestHead); 
                   if (hConnect) 
                         InternetCloseHandle(hConnect); 
                   if (hInet) 
            InternetCloseHandle(hInet); 
    
                   return bRet;
         
    }