请教有关封装Wininet的问题

EraserPeople 2010-03-04 02:31:12
我想把wininet api封装成类(异步网络连接),大致写法如下:
头文件:
class CWininet
{
public:
static VOID GCallback(...); //静态
VOID callbackex(...);
int TlInternetOpen(...);
int TlInternetConnect(...);
private:
HINTERNET m_hInternetSession;
HINTERNET m_hConnect;
HINTERNET m_hRequest;
HANDLE m_hConnectedEvent;
}
主要想法是把网络操作封装到一个类里,这样外面就可以声明变量,实现多个网络操作.

CPP文件:
INT CTlWininet::TlInternetOpen(LPCWSTR lpszAgent,DWORD dwAccessType,LPCWSTR lpszProxy,LPCWSTR lpszProxyBypass,DWORD dwFlags )
{
m_hInternetSession = InternetOpen(lpszAgent,dwAccessType,lpszProxy,lpszProxyBypass,dwFlags);
InternetSetStatusCallback(m_hInternetSession,(INTERNET_STATUS_CALLBACK)CTrWininet::TrCallback);
return TL_OK;
}

VOID CTlWininet::TlCallback( HINTERNET hInternet, DWORD_PTR dwContext, DWORD dwInternetStatus, LPVOID lpStatusInfo, DWORD dwStatusInfoLen )
{
CTlWininet *pNet = (CTlWininet *)dwContext;
if( NULL != pNet )
{
pNet->callbackex( hInternet, dwInternetStatus, lpStatusInfo, dwStatusInfoLen );
}
}

VOID CTlWininet::callbackex( HINTERNET hInternet, DWORD dwInternetStatus, LPVOID lpStatusInfo, DWORD dwStatusInfoLen )
{
switch( m_status )
{
case TR_CONNECT:
if (dwInternetStatus == INTERNET_STATUS_HANDLE_CREATED)
{
INTERNET_ASYNC_RESULT *pRes = (INTERNET_ASYNC_RESULT *)lpStatusInfo;
m_hConnect = (HINTERNET)pRes->dwResult;
SetEvent(m_hConnectedEvent);
}
break;
}
}

INT CTlWininet::TlInternetConnect(LPCWSTR lpszServerName,INTERNET_PORT nServerPort,LPCWSTR lpszUserName,LPCWSTR lpszPassword,DWORD dwService,DWORD dwFlags)
{
m_hConnect = InternetConnect(m_hInternetSession,lpszServerName,nServerPort,lpszUserName,lpszPassword,dwService,dwFlags,(DWORD_PTR)this);
if( m_hConnect == NULL )
{
int nError = GetLastError();
if (nError != ERROR_IO_PENDING)
{

return TR_ERROR_INTERNET_CONNECT;
}
if(WaitForSingleObject(m_hConnectedEvent, TR_TIMEOUT) == WAIT_TIMEOUT)//;//INFINITE
{

return TR_ERROR_INTERNET_TIMEOUT;
}
}
return TL_OK;
}

InternetConnect函数的最后一个参数添写this的目的是在回调函数中可以操作相关变量,我的工程是WIN32控制台程序,在运行结束后会有个错误:
Unhandled exception at 0x7c94aaac in Wininet.exe: 0xc0000005:Access violation writing location 0x00030ff8

进一步调试发现两个问题:
(1) 如果我在一个函数中声明了上面类的变量,然后调用相关函数,运行正常,如果变量是在外面声明的则会报上面的错误,如:变量为某一类的成员变量.
(2) 如果变量为某一类的成员变量时,InternetConnect函数最后一个参数不写this也没问题,如写0,1,2...都没问题,写了this就错.
不知道为什么会出这样的问题,还请大家帮我分析一下.
...全文
107 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2010-05-17
  • 打赏
  • 举报
回复
结贴通知:
请lz注意结贴。。。。
skyfree 2010-03-07
  • 打赏
  • 举报
回复
生命周期的问题,你仔细断点调试一下能看出来,
Eleven 2010-03-05
  • 打赏
  • 举报
回复
0xc0000005,这个一般是由于指针越界或数组溢出等原因造成的。。。。。。。。。
EraserPeople 2010-03-05
  • 打赏
  • 举报
回复
没人能帮帮我吗?我应该怎么做?
EraserPeople 2010-03-04
  • 打赏
  • 举报
回复
能解释下吗?有什么问题?谢谢您.
d383137359 2010-03-04
  • 打赏
  • 举报
回复
这样子问题有点多 你去下个MSDN吧

孙鑫推荐的 msdn library january 2001
这是下载地址 http://community.csdn.net/

18,356

社区成员

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

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