请教有关封装Wininet的问题
我想把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就错.
不知道为什么会出这样的问题,还请大家帮我分析一下.