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: } 

posted on 2012-08-02 15:31  CrunchYou  阅读(364)  评论(0编辑  收藏  举报

导航