在此记录这段代码, 仅仅是为了以后使用时象使用文档模板一样方便而已.
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: }