zoukankan      html  css  js  c++  java
  • C Style SEH handling Example

    在此记录这段代码, 仅仅是为了以后使用时象使用文档模板一样方便而已.
    C++中的try/catch/final, 无法catch C0000005这样的异常,虽然出现内存访问一定表示
    程序设计的Bug,但这样的Bug有时候可能作为一个潜在的Bug随产品被Release出去时,可能
    会带来某些麻烦,所以,此时用C提供的异常框架还是一个不错的选择。
     
      1: 
    
      2: typedef enum _EWinInetApiCode {
    
      3:     winet_InertnetOpen        = 0xFFFFFFF1,
    
      4:     winet_InternetCrackUrl    = 0xFFFFFFF2,
    
      5:     winet_InternetConnect    = 0xFFFFFFF3,
    
      6:     winet_HttpOpenRequest    = 0xFFFFFFF4,
    
      7:     winet_HttpSendRequestEx = 0xFFFFFFF5,
    
      8:     winet_InternetWriteFile = 0xFFFFFFF6,
    
      9:     winet_HttpEndRequest    = 0xFFFFFFF7,
    
     10:     winet_InternetReadFile    = 0xFFFFFFF8
    
     11: }EWinInetApicode;
    
     12: 
    
     13: int ExceptionHandler(DWORD dwExcpCode, struct _EXCEPTION_POINTERS *ep) 
    
     14: {
    
     15:     
    
     16:     //DWORD dwExcpCode = ep->ExceptionRecord->ExceptionCode;    
    
     17:     
    
     18:     switch(ep->ExceptionRecord->ExceptionInformation[0]) {
    
     19:         case winet_InertnetOpen:
    
     20:             printf("InertnetOpen Exception: 0x%08X", dwExcpCode);
    
     21:             break;
    
     22:         case winet_InternetCrackUrl:
    
     23:             printf("InternetCrackUrl Exception: 0x%08X", dwExcpCode);
    
     24:             break;
    
     25:         case winet_InternetConnect:
    
     26:             printf("InternetConnect Exception: 0x%08X", dwExcpCode);
    
     27:             break;
    
     28:         case winet_HttpOpenRequest:
    
     29:             printf("HttpOpenRequest Exception: 0x%08X", dwExcpCode);
    
     30:             break;
    
     31:         case winet_HttpSendRequestEx:
    
     32:             printf("HttpSendRequestEx Exception: 0x%08X", dwExcpCode);
    
     33:             break;
    
     34:         case winet_InternetWriteFile:
    
     35:             printf("InternetWriteFile Exception: 0x%08X", dwExcpCode);
    
     36:             break;
    
     37:         case winet_HttpEndRequest:
    
     38:             printf("HttpEndRequest Exception: 0x%08X", dwExcpCode);
    
     39:             break;
    
     40:         case winet_InternetReadFile:
    
     41:             printf("InternetReadFile Exception: 0x%08X", dwExcpCode);
    
     42:             break;
    
     43:         default:
    
     44:             printf("Other Exception: 0x%08X", dwExcpCode);
    
     45:             break;
    
     46:     }
    
     47:     
    
     48:     return EXCEPTION_EXECUTE_HANDLER;
    
     49: }
    
     50: 
    
     51: __try {
    
     52:     __try {
    
     53:         hSession = InternetOpen(g_tcsAgent, 
    
     54:             INTERNET_OPEN_TYPE_PRECONFIG ,
    
     55:             NULL, 
    
     56:             NULL, 
    
     57:             0    // INTERNET_FLAG_ASYNC 
    
     58:             );
    
     59:         if(hSession == NULL) {
    
     60:             ulExcpArgu[0] = winet_InertnetOpen;
    
     61:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);
    
     62:         }                
    
     63: 
    
     64: 
    
     65:         InitUrlComponents(&urlComponents);
    
     66:         if(!InternetCrackUrl( g_tcsUrl, 0, ICU_DECODE, &urlComponents )) {
    
     67:             ulExcpArgu[0] = winet_InternetCrackUrl;
    
     68:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);
    
     69:         }            
    
     70:         
    
     71:         hConnect = InternetConnect(
    
     72:             hSession,                    // HINTERNET hInternet, 
    
     73:             urlComponents.lpszHostName,    // LPCTSTR lpszServerName, 
    
     74:             urlComponents.nPort,        // INTERNET_PORT nServerPort, 
    
     75:             NULL,                        // LPCTSTR lpszUserName, 
    
     76:             NULL,                        // LPCTSTR lpszPassword, 
    
     77:             INTERNET_SERVICE_HTTP,        // DWORD dwService, 
    
     78:             0,                            // DWORD dwFlags, 
    
     79:             0                            // DWORD dwContext
    
     80:             );
    
     81:         if(hConnect == NULL) {        
    
     82:             ulExcpArgu[0] = winet_InternetConnect;
    
     83:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);
    
     84:         }
    
     85: 
    
     86:         hRequest = HttpOpenRequest(hConnect, 
    
     87:             _T("POST"), 
    
     88:             urlComponents.lpszUrlPath, 
    
     89:             NULL, NULL, NULL, 
    
     90:             INTERNET_FLAG_TRANSFER_ASCII| INTERNET_FLAG_NO_CACHE_WRITE| INTERNET_FLAG_RELOAD, 
    
     91:             0
    
     92:             );
    
     93:         if(hRequest == NULL) {        
    
     94:             ulExcpArgu[0] = winet_HttpOpenRequest;
    
     95:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);        
    
     96:         }
    
     97: 
    
     98:         INTERNET_BUFFERS inetBuf;
    
     99:         DWORD dwBytesWritten;
    
    100: 
    
    101:         memset(&inetBuf, 0, sizeof(INTERNET_BUFFERS));
    
    102:         inetBuf.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur
    
    103:         inetBuf.Next = NULL; 
    
    104:         inetBuf.lpcszHeader = g_tcsHeader; // 请求头
    
    105:         inetBuf.dwHeadersLength = _tcslen(inetBuf.lpcszHeader);
    
    106:         inetBuf.dwBufferTotal = ulBufLen; // This is the only member used other than dwStructSize
    
    107: 
    
    108:         if(!HttpSendRequestEx( hRequest, &inetBuf, NULL, 0, 0)){
    
    109:             ulExcpArgu[0] = winet_HttpSendRequestEx;
    
    110:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);
    
    111:         }
    
    112: 
    
    113: 
    
    114:         if(!InternetWriteFile( hRequest, lpDataBuf, ulBufLen, &dwBytesWritten)){
    
    115:             ulExcpArgu[0] = winet_InternetWriteFile;
    
    116:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);
    
    117:         }
    
    118: 
    
    119:         if(!HttpEndRequest(hRequest, NULL, 0, 0)){
    
    120:             ulExcpArgu[0] = winet_HttpEndRequest;
    
    121:             RaiseException(GetLastError(), 0, 1, ulExcpArgu);
    
    122:         }
    
    123: 
    
    124:         char pcBuffer[512];
    
    125:         DWORD dwBytesRead;
    
    126: 
    
    127:         do {
    
    128:             dwBytesRead=0;
    
    129:             if(InternetReadFile(hRequest, pcBuffer, 512-1, &dwBytesRead)) {
    
    130:                 pcBuffer[dwBytesRead] = 0;
    
    131:                 printf(pcBuffer);
    
    132:             }
    
    133:         }while(dwBytesRead>0);
    
    134: 
    
    135:     }__except(ExceptionHandler(GetExceptionCode(),GetExceptionInformation())) {
    
    136:         
    
    137:     } 
    
    138: }__finally {
    
    139: 
    
    140:     if (hRequest)
    
    141:         InternetCloseHandle(hRequest);
    
    142:     if (hConnect)
    
    143:         InternetCloseHandle(hConnect);
    
    144: 
    
    145:     if (hSession)
    
    146:         InternetCloseHandle(hSession);
    
    147: 
    
    148:     UninitUrlComponents(&urlComponents);
    
    149: } 
  • 相关阅读:
    PowerDesigner导出SQL脚本
    【Android进阶学习】shape和selector的结合使用(转)
    国内最新安卓渠道列表42个(转)
    安卓新框架
    通知和消息有什么区别?(转)
    XSS之xssprotect(转)
    为你的Android App实现自签名的 SSL 证书(转)
    HTTPS和HTTP的区别(转)
    IT软件技术人员的职位路线(从程序员到技术总监)
    听大神说:https和http有何区别?(转)
  • 原文地址:https://www.cnblogs.com/crunchyou/p/2620088.html
Copyright © 2011-2022 走看看