今天调试一段代码,这段程序之前可以运行,但是在我加入一些新的内容以后,再运行就出问题了,出现

First-chance exception in HttpAndFtpTest.exe (KERNEL32.DLL): 0xC0000005: Access Violation

的警告,后来跟踪进去,发现在

 CONST TCHAR *szAcceptType=__HTTP_ACCEPT_TYPE;

 _hHTTPRequest=::HttpOpenRequest( _hHTTPConnection,
               __HTTP_VERB_GET, // HTTP Verb
               szURI, // Object Name
               HTTP_VERSION, // Version
               NULL, // Reference
               &szAcceptType, // Accept Type
               INTERNET_FLAG_KEEP_CONNECTION | NTERNET_FLAG_NO_CACHE_WRITE,
               0); // context call-back point

这段出了问题,搜了下网上,刚好有个人总结了该函数的问题,出现这个问题的原因是因为强制把szAcceptType这个1维数组变成2维数组,它的第二个数组没有'\0'结尾所导致的访问冲突。

我将第一句改成

CONST TCHAR *szAcceptType[2]={__HTTP_ACCEPT_TYPE,NULL};

就可以了。

总结:

1、在别的程序可以正确运行的程序,不一定是正确的,可能因为某些原因,刚好可以错误运行。不能因为这段程序在别的环境可以运行就以为一定正确。

2、这个函数的原型是:

HINTERNET WINAPI HttpOpenRequest(
  HINTERNET hConnect,
  LPCTSTR lpszVerb,
  LPCTSTR lpszObjectName,
  LPCTSTR lpszVersion,
  LPCTSTR lpszReferrer,
  LPCTSTR* lplpszAcceptTypes,
  DWORD dwFlags,
  DWORD dwContext
);

其中 LPCTSTR* lplpszAcceptTypes, lplpsz表示其是二维的文本指针,既然如此,那么就要注意各个文本的结束符问题,这个是最重要的,以后在看msdn的函数时,一定要注意相关的问题。