webservice系列教学(15)-如何调用webservice(vc6)

80酷酷网    80kuku.com

  web//////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CMClientDlg::AddtoTree()
//
//  parameters: (HTREEITEM hParent, HTREEITEM hInsertAfter, LPTSTR pszData, UINT mask, IUnknown
//              * theInterface)
//
//  description: insert the tree item to Tree
//
//  returns: HTREEITEM
//
//////////////////////////////////////////////////////////////////////////////////////////////////
HTREEITEM CMClientDlg::AddtoTree(HTREEITEM hParent, HTREEITEM hInsertAfter, LPTSTR pszData, UINT mask,
                                 IUnknown * theInterface)
{
    TV_INSERTSTRUCT            curTreeItem;
    HTREEITEM                hReturn;
    
    curTreeItem.hParent = hParent;
    curTreeItem.hInsertAfter = hInsertAfter;
    curTreeItem.item.pszText = pszData;
    curTreeItem.item.mask = mask |LVIF_PARAM;
    curTreeItem.item.lParam = reinterpret_cast<DWORD>(theInterface);

    hReturn = m_TreeCtrl.InsertItem(&curTreeItem);
// if insertion  fails , it will return NULL, otherwise it will return Handle of the new item,
    if  (hReturn)
        theInterface->AddRef();

    return hReturn;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CMClientDlg::nCountParameter()
//
//  parameters: No Parameters
//
//  description: counts the number of parameters, the function takes
//  returns: int
//
//////////////////////////////////////////////////////////////////////////////////////////////////
int CMClientDlg::nCountParameter()
{
    LVITEM            Item;
    int             nCounter;
    int             nNum;
    smIsInputEnum   IsInput;

    nNum        =   m_Parameters.GetItemCount();

    for ( nCounter = 0;  nCounter <= nNum ;nCounter ++)
    {
        assignItem(&Item, LVIF_PARAM,nCounter,0,0,0);
        // if could not get the item from list, return -1
        if (m_Parameters.GetItem(&Item) == 0)
            return -1;
        reinterpret_cast<ISoapMapper *>(Item.lParam)->get_isInput(&IsInput);
        if (IsInput == smOutput)
            nNum --;
    }
    
    return  nNum;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CMClientDlg::ModifyDialog()
//
//  parameters: No Parameter
//
//  description: modifies the parameter list dialog
//  returns: int
//
//////////////////////////////////////////////////////////////////////////////////////////////////
int CMClientDlg::ModifyDialog()
{
    // modify the list control dialog , add two more column with their headers
    RECT        rListDialog;
    int         nReturn        = 0;
    int         flag           = 1;

    m_Parameters.GetClientRect(&rListDialog);

    nReturn = m_Parameters.InsertColumn(0, _T("Variable"), LVCFMT_LEFT, (rListDialog.right - rListDialog.left) / 3 );
    if (nReturn == -1)
    {
        flag = 0;
        MSG("Could not modify the dialog");
    }
    nReturn =m_Parameters.InsertColumn(1, _T("Type"), LVCFMT_LEFT,(rListDialog.right - rListDialog.left) / 3 );
    if (nReturn == -1)
    {
        flag = 0;
        MSG("Could not modify the dialog");
    }
    nReturn =m_Parameters.InsertColumn(2, _T("Value"),LVCFMT_LEFT,(rListDialog.right - rListDialog.left)-(2*(rListDialog.right - rListDialog.left)/3));
    if (nReturn == -1)
    {
        flag = 0;
        MSG("Could not modify the dialog");
    }

    UpdateData(false);
cleanup:
    if (flag == 0)
        return -1;
    return 1;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CMClientDlg::CheckforURL()
//
//  parameters: No Parameters
//
//  description: checks whether URL for wsdl file is given or not. if it is not given , returns -1
//  returns: int
//
//////////////////////////////////////////////////////////////////////////////////////////////////
int CMClientDlg::CheckforURL()
{
    int flag = 1;
    if (m_strURL.IsEmpty())
    {
        flag = 0;
        MSG("WSDL file is not given");
    }
cleanup:
    if (flag == 0)
        return -1;

    return 1;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CMClientDlg::DestroyTree()
//
//  parameters: No Parameters
//
//  description: deletes the existing tree, if any problem occurs for deleting returns false
//  returns: bool
//
//////////////////////////////////////////////////////////////////////////////////////////////////
bool CMClientDlg::DestroyTree()
{
    // if any tree exist, delete it ,and also delete the list
    int flag = 1;
    if (m_TreeCtrl.GetCount() != 0)
    {
        if (!m_TreeCtrl.DeleteAllItems())
        {
            flag = 0;
            MSG("Tree could not be destroyed");
        }

        if (m_Parameters.GetItemCount() != 0)
        {
            if (m_Parameters.DeleteAllItems() == 0)
            {
                flag = 0;
                MSG("Parameter list could not be destroyed");;
            }
        }
    }

cleanup:
    if (flag ==0)
        return false;

    return true;
}

//////////////////////////////////////////////////////////////////////////////////////////////////
//  function: CMClientDlg::UpdateList()
//
//  parameters: No Parameters
//
//  description: Updates parameters of the operation
//
//  returns: int
//
//////////////////////////////////////////////////////////////////////////////////////////////////
int CMClientDlg::UpdateList()
{
    USES_CONVERSION;

    CComPtr<ISoapMapper>        pISoapMap;
    CComPtr<IEnumSoapMappers>    ppIenumSoapMappers;
    TVITEM                        TVitem;
    
    HRESULT                        hr                = S_OK;
    long                        cFetched;

    BSTR                        bstrElementName = 0;
    BSTR                        bstrElementType = 0;

    LVITEM                        LVitem;
    
    CString                        strTmp;

    int                            nCounter        = 0;
    int                         flag            = 1;
    int                         flagSM          = 0;

    smIsInputEnum                IsInput;

    // if list is not empty, delete it
    if (m_Parameters.GetItemCount() != 0)
    {
        if (m_Parameters.DeleteAllItems() == 0)
        {
            flag = 0;
            MSG("Could not delete list");
        }
    }
    // get the selected operation
    TVitem.mask = TVIF_PARAM;
    TVitem.hItem = m_TreeCtrl.GetSelectedItem();
    if (! TVitem.hItem)
    {
        flag = 0;
        MSG("Could not get selected item");
    }

    if (m_TreeCtrl.GetItem(&TVitem) == 0)
    {
        flag = 0;
        MSG("Could not get item");
    }

    // get parts of the operation

    hr = (reinterpret_cast<IWSDLOperation *> (TVitem.lParam))->GetOperationParts(&ppIenumSoapMappers);
    CHECK_HRESULT(hr,"Getting operation parts failed");

    // in this loop take each parameter one by one
    while(((hr = ppIenumSoapMappers->Next(1, &pISoapMap, &cFetched))== S_OK) &&(pISoapMap != NULL))
    {
        flagSM =1;
        // type of parameter
        hr = pISoapMap->get_elementType(&bstrElementType);
        CHECK_HRESULT(hr,"could not get name of parameter!");

        //name of parameter
        hr = pISoapMap->get_elementName(&bstrElementName);
        CHECK_HRESULT(hr,"could not get the type of parameter!");

        strTmp = bstrElementType;

        // check what type of parameter it is?  [in] , [in,out]...        
        hr = pISoapMap->get_isInput(&IsInput);
        CHECK_HRESULT(hr,"Checking input type is failed");

        if (IsInput == smInput)
        {
            strTmp += " [in]";
        }
        else if (IsInput == smInOut)
        {
            strTmp +=  " [in/out]";
        }
        else if (IsInput == smOutput)
        {
            strTmp +=  " [out]";
        }
        
        assignItem(&LVitem, LVIF_TEXT  | LVIF_PARAM, nCounter ++, 0,W2A(bstrElementName), ::SysStringLen(bstrElementName));

        LVitem.lParam    = (DWORD)(ISoapMapper*)pISoapMap;
        // insert the item in to list
        if (m_Parameters.InsertItem(&LVitem) == -1)
        {
            flag = 0;
            MSG("Could not set Item to list");
        }

        LVitem.mask      = LVIF_TEXT;
        LVitem.iSubItem  = 1;
        LVitem.pszText   = strTmp.GetBuffer(0);
        // insert the second column
        if (m_Parameters.SetItem(&LVitem) == 0)
        {
            flag = 0;
            MSG("Could not insert Item to list");
        }
        // I have to ADDREF() before pISoapMap = 0 , otherwise I will loose the object
        ((IUnknown*)pISoapMap)->AddRef();
        // release pISoapMap
        pISoapMap = 0;
    }
    if (flagSM == 0)
    {
        flag = 0;
        MSG("Getting operation parts failed");
    }

    UpdateData();

cleanup:
    ::SysFreeString(bstrElementName);
    ::SysFreeString(bstrElementType);

    if (flag == 0)
        return -1;

    return 1;
}

分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: