急,调用HttpOpenRequest后,出现的异常,如何解决?

ismycxp 2010-03-06 11:28:29
搞了三天,没解决,希望高手来帮忙!

功能:通过wininet获取网页代码

环境:VS2008(win32控制台程序)(在VC6下没有此问题,很奇怪)
代码如下:

#include "stdafx.h"
#include <Windows.h>
#include <wininet.h>
#include <iostream>
#include <string>

#pragma comment(lib,"Wininet.lib")

#define __HTTP_ACCEPT_TYPE _T("*/*")
#define __HTTP_ACCEPT _T("Accept: */*")
#define __HTTP_VERB_GET _T("GET")
#define __HTTP_VERB_POST _T("POST")
#define __SIZE_BUFFER 1024

using namespace std;

#ifndef tstring
#ifndef _UNICODE
#define tstring string
#else
#define tstring wstring
#endif
#endif
//解析URL
void ParseURL(tstring strURL,tstring& strProtocol,tstring& strAddress,DWORD &dwPort,tstring& strURI)
{
DWORD dwPosition=0,dwStartPosition=0;
tstring::size_type nUrlSize=strURL.size();
BOOL bFlag=FALSE;

//查找协议,如:http://
while(dwPosition<nUrlSize)
{
if(strURL[dwPosition]==_T(':') && strURL[dwPosition+1]==_T('/') && strURL[dwPosition+2]==_T('/'))
{
break;
}
dwPosition++;
}

if(dwPosition==nUrlSize) //没有协议,如www.linuxsir.org/bbs/printthread.php?t=53761
{
strProtocol=_T("http");
dwPosition=0;
}
else if(strURL[dwPosition+1]==_T('/'))
{ //是一个协议
strProtocol=strURL.substr(0,dwPosition).c_str();
for(tstring::size_type i=0; i < strProtocol.size(); i++)
{
strProtocol[i] = tolower(strProtocol[i]);
}
dwStartPosition=dwPosition+=3;
}

while(nUrlSize>0 && dwPosition<nUrlSize && strURL[dwPosition]!=_T('/'))
++dwPosition;

DWORD dwFind=dwStartPosition;

for(;dwFind<=dwPosition;dwFind++){
if(strURL[dwFind]==_T(':'))
{ // find PORT
bFlag=TRUE;
break;
}
}

if(bFlag)
{
tstring strTmp=strURL.substr(dwFind+1,dwPosition-dwFind);
dwPort=_ttol(strTmp.c_str()); //端口
strAddress=strURL.substr(dwStartPosition,dwFind-dwStartPosition); //地址(域名)
}
else if(strProtocol==_T("https"))
{
dwPort=INTERNET_DEFAULT_HTTPS_PORT;
strAddress=strURL.substr(dwStartPosition,dwPosition-dwStartPosition);
}
else
{
dwPort=INTERNET_DEFAULT_HTTP_PORT;
strAddress=strURL.substr(dwStartPosition,dwPosition-dwStartPosition);
}

if(dwPosition<nUrlSize) strURI=strURL.substr(dwPosition,nUrlSize-dwPosition);
else strURI=_T("");
}



int _tmain(int argc, _TCHAR* argv[])
{
tstring strAgent=_T("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
tstring strURL=_T("http://www.baidu.com/index.php");
tstring strProtocol,strAddress,strURI;
DWORD dwPort;
ParseURL(strURL,strProtocol,strAddress,dwPort,strURI);
HINTERNET _hHttpSession=::InternetOpen(strAgent.c_str(),INTERNET_OPEN_TYPE_PRECONFIG,_T(""),_T(""),0);
HINTERNET _hHttpConnection=::InternetConnect(_hHttpSession,
strAddress.c_str(),
dwPort,
NULL,
NULL,
INTERNET_SERVICE_HTTP,
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
0);
if(::InternetAttemptConnect(NULL)!=ERROR_SUCCESS) return 0;
CONST TCHAR *szAcceptType=_T("*/*");

//就是下面这句出现问题,错误就是弹出一对话框,信息如下:
//ConsoleTest.exe 中的 0x7c84b57b 处未处理的异常: 0xC0000005: 读取位置 0xcccccccc 时发生访问冲突
//我检查了N遍,上面的代码都没错,连接也成功了,但就是HttpOpenRequest不成功 HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),
&szAcceptType,
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
NULL);

return 0;
}


请教高手,如何解决


...全文
506 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxcyly1985 2010-09-06
  • 打赏
  • 举报
回复
LPTSTR* lpAccpt = new TCHAR*[2];
*lpAccpt = csAcceptType.GetBuffer(1);
*(lpAccpt + 1) = NULL;
LPCTSTR* cLpAccept = (LPCTSTR*)lpAccpt;

再传入就不会有冲突了,那个是个二维数组指针,其实不是取指针的地址
ziplj 2010-03-06
  • 打赏
  • 举报
回复
引用 7 楼 ismycxp 的回复:
兄弟,这里为什么要加一个\0呢?

没什么用 copy的 只用强制转换就行了
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
引用 4 楼 ziplj 的回复:
试试 我这边测试成功的
C/C++ code
HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),//&szAcceptType,// (LPCWSTR*)szAcceptType, (LPCWSTR*)"*/*\0",
INTERNET_FLAG_KEEP_CONNECTION| INTERNET_FLAG_NO_CACHE_WRITE,
NULL);


兄弟,这里为什么要加一个\0呢?
ziplj 2010-03-06
  • 打赏
  • 举报
回复
用Unicode测试上面的代码 我这边测试通过了
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
呵呵,谢谢你,解决了,给你加分
ziplj 2010-03-06
  • 打赏
  • 举报
回复
试试 我这边测试成功的

HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),
//&szAcceptType,
// (LPCWSTR*)szAcceptType,
(LPCWSTR*) "*/*\0",
INTERNET_FLAG_KEEP_CONNECTION | INTERNET_FLAG_NO_CACHE_WRITE,
NULL);
ziplj 2010-03-06
  • 打赏
  • 举报
回复
引用 2 楼 ismycxp 的回复:
引用 1 楼 ziplj 的回复:
Unicode的问题  你把项目属性的Unicode换成多字节版本

啊,真的可以了,

但我一直以来都是用unicode,如果坚持unicode要怎么解决这个问题呢?

总不可能unicode没有此功能吧!
我在找解决方案 找了半天了
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
引用 1 楼 ziplj 的回复:
Unicode的问题  你把项目属性的Unicode换成多字节版本 


啊,真的可以了,

但我一直以来都是用unicode,如果坚持unicode要怎么解决这个问题呢?

总不可能unicode没有此功能吧!
ziplj 2010-03-06
  • 打赏
  • 举报
回复
Unicode的问题 你把项目属性的Unicode换成多字节版本
ismycxp 2010-03-06
  • 打赏
  • 举报
回复
引用 4 楼 ziplj 的回复:
试试 我这边测试成功的
C/C++ code
HINTERNET _hHttpRequest=::HttpOpenRequest(_hHttpConnection,
_T("GET"),
strURI.c_str(),
_T("HTTP/1.1"),
strURL.c_str(),//&szAcceptType,// (LPCWSTR*)szAcceptType, (LPCWSTR*)"*/*\0",
INTERNET_FLAG_KEEP_CONNECTION| INTERNET_FLAG_NO_CACHE_WRITE,
NULL);


(LPCWSTR*)"*/*\0",
//为什么这里不是_T("*/*\0"),我这里加上_T后就会出现异常,为什么会这样呀

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧