2012-04-28 3 views
1

Я пишу приложение для windows mobile 6 от eVC++.Как подключиться к Интернету в Windows Mobile?

Я использую следующий класс для отправки своих данных в веб-сервис.

Моя проблема в том, когда я хочу отправить свои данные, сначала мне нужно запустить Internet Explorer, и после запуска GPRS я могу отправить свои данные, используя следующий класс.

Я хочу знать, как я могу запускать GPRS-соединение программно.

Что следует добавить в мой код?

Спасибо,

// GPRSConnection.cpp: implementation of the GPRSConnection class. 
// 
////////////////////////////////////////////////////////////////////// 

#include "stdafx.h" 
#include "visitor.h" 
#include "GPRSConnection.h" 

#include <windows.h> 
#include <commctrl.h> 
#include "connmgr.h" 


#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 

////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 

GPRSConnection::GPRSConnection() 
{ 

} 

GPRSConnection::~GPRSConnection() 
{ 

} 

void GPRSConnection::ThrowHttpException(int nCode) 
{ 
    CInternetException* pEx = new CInternetException(nCode); 
    THROW(pEx); 
} 

int GPRSConnection::InvokeWebServiceMethod(LPTSTR szAddress, LPTSTR strMethodName, 
           CArray<WebServiceParameter, WebServiceParameter>& parameters, 
           CString* DownloadedXML, LPTSTR* Message, LPVOID lpParameter) 
{ 
    int nRetCode = 0; 

    *DownloadedXML = _T(""); 

    DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS; 
    const TCHAR szHeaders[] = _T("Accept: text/*\r\nUser-Agent: MFC_Http_Sample\r\n"); 
    DWORD dwHttpRequestFlags = INTERNET_FLAG_NO_AUTO_REDIRECT; 
    BOOL bSuccess = TRUE; 

    CString webAddress = szAddress; 
    webAddress = webAddress + _T("/") + strMethodName + _T("?"); 
    for(int i=0; i< parameters.GetSize(); i++) 
    { 
     webAddress = webAddress + parameters[i].Name + _T("="); 
     webAddress = webAddress + parameters[i].Value + _T("&"); 
    } 
    webAddress = webAddress.Left(webAddress.GetLength()-1); 

    CMyHttpSession session(CString((LPCTSTR)IDS_HTTPAPP), (DWORD)lpParameter, dwAccessType); 
    CHttpConnection* pServer = NULL; 
    CHttpFile* pFile = NULL; 
    TRY 
    { 
     // check to see if this is a reasonable URL 
     CString strServerName; 
     CString strObject; 
     INTERNET_PORT nPort; 
     DWORD dwServiceType; 

     if (!AfxParseURL(webAddress, dwServiceType, strServerName, strObject, nPort) || 
      dwServiceType != INTERNET_SERVICE_HTTP) 
     { 
      *Message = _T("Error: can only use URLs beginning with http://"); 
      nRetCode = 100; 
      ThrowHttpException(kError1); 
     } 

     session.EnableStatusCallback(TRUE); 

     pServer = session.GetHttpConnection(strServerName, nPort); 

     pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, strObject, NULL, (DWORD)lpParameter, NULL, NULL, dwHttpRequestFlags); 
     pFile->AddRequestHeaders(szHeaders); 
     pFile->SendRequest(); 

     DWORD dwRet; 
     pFile->QueryInfoStatusCode(dwRet); 

     if (dwRet == HTTP_STATUS_DENIED) 
     { 
      nRetCode = 100; 
      *Message = _T("Access to the secured http site is denied!"); 
      // now an error page should be downloaded  
     } 

     CString strNewLocation; 
     pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); 

     // were we redirected? 
     // these response status codes come from WININET.H 

     if (dwRet == HTTP_STATUS_MOVED || 
      dwRet == HTTP_STATUS_REDIRECT || 
      dwRet == HTTP_STATUS_REDIRECT_METHOD) 
     { 
      CString strNewLocation; 
      pFile->QueryInfo(HTTP_QUERY_RAW_HEADERS_CRLF, strNewLocation); 

      int nPlace = strNewLocation.Find(_T("Location: ")); 
      if (nPlace == -1) 
      { 
       *Message = _T("Error: Site redirects with no new location"); 
       nRetCode = 100; 
       ThrowHttpException(kError2); 
      } 

      strNewLocation = strNewLocation.Mid(nPlace + 10); 
      nPlace = strNewLocation.Find('\n'); 
      if (nPlace > 0) 
       strNewLocation = strNewLocation.Left(nPlace); 

      // close up the redirected site 

      pFile->Close(); 
      delete pFile; 
      pServer->Close(); 
      delete pServer; 

      // figure out what the old place was 
      if (!AfxParseURL(strNewLocation, dwServiceType, strServerName, strObject, nPort)) 
      { 
       *Message = _T("Error: the redirected URL could not be parsed"); 
       nRetCode = 100; 
       ThrowHttpException(kError2); 
      } 

      if (dwServiceType != INTERNET_SERVICE_HTTP) 
      { 
       *Message = _T("Error: the redirected URL does not reference a HTTP resource"); 
       nRetCode = 100; 
       ThrowHttpException(kError2); 
      } 

      // try again at the new location 
      pServer = session.GetHttpConnection(strServerName, nPort); 
      pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, 
       strObject, NULL, (DWORD)lpParameter, NULL, NULL, dwHttpRequestFlags); 
      pFile->AddRequestHeaders(szHeaders); 
      pFile->SendRequest(); 

      pFile->QueryInfoStatusCode(dwRet); 
      if (dwRet != HTTP_STATUS_OK) 
       ThrowHttpException(kError2); 
     } 

     TCHAR* szWEBPage = new TCHAR[MAX_WEBPAGE_SIZE+1]; 
     if(szWEBPage) 
     { 
      szWEBPage[0] = L'\0'; 

      TCHAR* sz  = new TCHAR[BUFFER_SIZE+1]; 
      TCHAR* szwBuf = new TCHAR[(BUFFER_SIZE+1)*2]; 

      sz[0] = L'\0'; 
      szwBuf[0] = L'\0'; 
      int n = 0; 
      pFile->SetReadBufferSize(BUFFER_SIZE*2); 
      while (pFile->ReadString(sz, BUFFER_SIZE)) 
      { 

       //----------------------------- 
       /* 
       CString print; 
       //print.Format(_T("%d "), szwBuf[124]); 
       int adad = (int)sz[0]; 
       print.Format(_T("%d"), adad); 
       //print.SetAt(0, sz[62]); 
       MsgBox(NULL, print, B_OK, I_INFORMATION); 

        //MsgBox(NULL, str, B_OK, I_INFORMATION); 
        */ 
       //----------------------------- 

       wce_AsciiToWide(szwBuf, (const char*)sz);   

       n += _tcslen(szwBuf); 
       if(n >= MAX_WEBPAGE_SIZE) 
        break; 
       _tcscat(szWEBPage, szwBuf);    
      } 
      delete [] sz; 
      delete [] szwBuf; 
      //SetDlgItemText(IDC_EDIT1, szWEBPage); 
      *DownloadedXML = szWEBPage; 
     } 

     /* 
     CString aaa; 
     aaa.Format(_T("%d"), (*DownloadedXML).GetLength()); 
     MsgBox(NULL, aaa, B_OK, I_INFORMATION); 
     */ 

     delete [] szWEBPage; 
     pFile->Close(); 
     pServer->Close(); 
    } 
    CATCH (CInternetException, pEx) 
    { 
     // catch things wrong with parameters, etc 
     if (pEx->m_dwError < kErrorMin) 
     { 
      TCHAR szError[MAX_PATH]=TEXT("\0"); 
      pEx->GetErrorMessage(szError,MAX_PATH,NULL); 
      //SetDlgItemText(IDC_EDIT_PAGE, szError); 
      nRetCode = 100; 
      CString err = szError; 
      *Message = err.GetBuffer(0); 
     } 
     bSuccess = FALSE; 
    } 
    AND_CATCH (CMemoryException, pMemory) 
    { 
     // catch things wrong with memory 
     //SetDlgItemText(IDC_EDIT_PAGE,CString((LPCTSTR)IDS_MEMORYEXCEPTION)); 
     *Message = _T("Not enough memory to download http page"); 
     nRetCode = 100; 
     pMemory->Delete(); 
     bSuccess = FALSE; 
    } 
    END_CATCH_ALL 

    if (pFile != NULL) 
     delete pFile; 
    if (pServer != NULL) 
     delete pServer; 
    session.Close(); 

    if(bSuccess) 
    { 
     *Message = _T("Completed successfully!"); 
    } 

    return nRetCode; 
} 

///////////////////////////////////////////////////////////////////////////// 
// CHttpSession object 

// Http wants to use its own derivative of the CHttpSession class 
// just so it can implement an OnStatusCallback() override. 


CMyHttpSession::CMyHttpSession(LPCTSTR pszAppName, DWORD dwContext, int nMethod) 
    : CInternetSession(pszAppName, dwContext, nMethod) 
{ 
} 

void CMyHttpSession::OnStatusCallback(DWORD dwContext, DWORD dwInternetStatus, 
    LPVOID /* lpvStatusInfomration */, DWORD /* dwStatusInformationLen */) 
{ 
    //CMainPage* pDlg = (CMainPage*)dwContext; 
    //if(!pDlg) 
     return; 
/* 
    switch(dwInternetStatus) 
    { 
     case INTERNET_STATUS_RESOLVING_NAME: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_IPLOOKING)); 
      break; 
     case INTERNET_STATUS_NAME_RESOLVED: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_IPFOUND)); 
      break; 
     case INTERNET_STATUS_CONNECTING_TO_SERVER: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_CONNECTING)); 
      break; 
     case INTERNET_STATUS_CONNECTED_TO_SERVER: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_CONNECTED)); 
      break; 
     case INTERNET_STATUS_SENDING_REQUEST: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_REQUEST)); 
      break; 
     case INTERNET_STATUS_REQUEST_SENT: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_SENT)); 
      break; 
     case INTERNET_STATUS_RECEIVING_RESPONSE: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_WAITING)); 
      break; 
     case INTERNET_STATUS_RESPONSE_RECEIVED: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_RECEIVED)); 
      break; 
     case INTERNET_STATUS_CLOSING_CONNECTION: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_CLOSING)); 
      break; 
     case INTERNET_STATUS_CONNECTION_CLOSED: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_CLOSED)); 
      break; 
     case INTERNET_STATUS_HANDLE_CREATED: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_CONNECTED2)); 
      break; 
     case INTERNET_STATUS_HANDLE_CLOSING: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_DISCONNECTED)); 
      break; 
     case INTERNET_STATUS_REQUEST_COMPLETE: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_COMPLETED)); 
      break; 
     case INTERNET_STATUS_REDIRECT: 
      pDlg->SetDlgItemText(IDC_MESSAGE, CString((LPCTSTR)IDS_REDIRECTED)); 
      break; 
    } 
    */ 
} 
+0

какие-либо предложения? – Conscious

ответ

Смежные вопросы