CComPtr<ISoapClient> spSOAPClient;
HRESULT hr = spSOAPClient.CoCreateInstance(MSSOAPLib30::CLSID_SoapClient30);
CHECK_HR(hr); hr = spSOAPClient->MSSoapInit(
_bstr_t("http://localhost/MyWebService/MyWebService.wsdl"), 
_bstr_t("MyWebService"), 
_bstr_t("MyEEESoapPort"), 
_bstr_t("http://localhost/MyWebService/MyWebService.wsml")
);
CHECK_HR(hr);
WCHAR *pwcMethodName = L"test1";

//DISPID mydispid
DISPID dispidFn1 = 0;
hr = spSOAPClient->GetIDsOfNames(IID_NULL, &pwcMethodName, 1, 
GetUserDefaultLCID(), &dispidFn1);
CHECK_HR(hr);
DISPPARAMS params = {NULL, NULL, 0, 0};

unsigned int uArgErr = -1;
_variant_t result;
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof(excepInfo));
hr = spSOAPClient->Invoke(
dispidFn1, 
IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, 
&params,
&result, 
&excepInfo,
&uArgErr); if (FAILED(hr)) {
if(hr = DISP_E_EXCEPTION)
AfxMessageBox("ERROR");

exit(0);
return; }
反正程序调用invoke时候就错了描述:
ATL写了一个COM组件, 有一个test函数 ,但无参数
使用WSDLGen产生WSDL, WSML文件请问我的程序错在哪里, 为什么执行到invoke就出错.
谢谢各位, 
up有分

解决方案 »

  1.   

    请教一个问题,我在和你做类似的事情,
    我新创建了一个win32 application,然后在stdafx.h中加入了
    #import "msxml4.dll" 
    using namespace MSXML2;#import "C:\Program Files\Common Files\MSSoap\Binaries\mssoap30.dll"             exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER",                     "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
    using namespace MSSOAPLib30;
    然后在test.cpp里
    #include "stdafx.h"int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    CoInitialize(NULL);
    HRESULT hr;
    ISOAPClient m_pSoapClient = NULL; if (m_pSoapClient != NULL) m_pSoapClient.Release();
    hr = m_pSoapClient.CreateInstance(__uuidof(SoapClient));
    if(FAILED(hr))
    {
    MessageBox(NULL,TEXT("Cannot create SoapClient."), NULL,MB_OK);
    return false;
    }
    try
    {
    m_pSoapClient->mssoapinit((LPCTSTR)TEXT("http://zym/TempConvert1/Service1.asmx?wsdl"), _T(""), _T(""), _T(""));
    }
    catch(_com_error err)
    {
    MessageBox(NULL,TEXT("Cannot initialize SoapClient."), NULL,MB_OK);
    return false;
    } CoUninitialize();
    return 0;
    }但我这报error C2065: 'ISOAPClient' : undeclared identifier,为什么?
    我该加入些头文件?还是要copy一些文件到我应用程序目录下?!在线等待!
      

  2.   

    发现是由于名称空间的问题,但我已经引用了啊!奇怪!
    现在我改成
    MSSOAPLib30::ISoapClientPtr m_pSoapClient = NULL; if (m_pSoapClient != NULL) m_pSoapClient.Release();
    hr = m_pSoapClient.CreateInstance(__uuidof(MSSOAPLib30::CLSID_SoapClient30));
    发现MSSOAPLib30没有CLSID_SoapClient30这个成员?为什么?
    能否在线请教?
      

  3.   

    唉, 没人教我, 反到我都帮你了, 看看以下的代码
    不过我的代码是基于对话框的.
    在dlg.h 声明 ISoapClientPtr m_pSoapClient;
    HRESULT hr = m_pSoapClient.CreateInstance(__uuidof(SoapClient30));
    CHECK_HR(hr);

    CString Path;
    GetModuleFileName(AfxGetApp()->m_hInstance, Path.GetBuffer(_MAX_PATH), _MAX_PATH);
    Path.ReleaseBuffer();

    Path = Path.Left(Path.ReverseFind(_T('\\'))+1);

    CString WsdlFile = Path + _T("MyWebService.wsdl"); m_pSoapClient->MSSoapInit2(
    _variant_t(WsdlFile), 
    _T(""), 
    _T("MyWebService"), 
    _T("MyWebServiceSoapPort"), 
    _T("http://tempuri.org/MyWebService/wsdl/")
    );
    CHECK_HR(hr);


    WCHAR *pwcMethodName = L"Add";

    //DISPID mydispid
    DISPID dispidFn1 = 0;
    hr = m_pSoapClient->GetIDsOfNames(IID_NULL, &pwcMethodName, 1, 
    LOCALE_SYSTEM_DEFAULT, &dispidFn1);
    CHECK_HR(hr);

    DISPPARAMS dispparams;
    VARIANTARG params[2];
    VARIANT result;
    CString ParamText;
    EXCEPINFO ExceptInfo;

    VariantInit(&params[0]);
    params[0].vt = VT_BSTR;
    // m_BCtl.GetWindowText(ParamText);
    ParamText = "10";
    params[0].bstrVal = ParamText.AllocSysString();
    hr = VariantChangeType(&params[0], &params[0], 0, VT_R8);
    CHECK_HR(hr);

    // Set A parameter.
    VariantInit(&params[1]);
    params[1].vt = VT_BSTR;
    // m_ACtl.GetWindowText(ParamText);
    ParamText = "5";
    params[1].bstrVal = ParamText.AllocSysString();
    hr = VariantChangeType(&params[1], &params[1], 0, VT_R8); CHECK_HR(hr);
    // Initialize DISPPARAMS structure.
    dispparams.cArgs = 2;
    dispparams.cNamedArgs = 0;
    dispparams.rgdispidNamedArgs = NULL;
    dispparams.rgvarg = params;

    // Prepare result variant.
    VariantInit(&result);


    hr = m_pSoapClient->Invoke(
    dispidFn1, 
    IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, 
    &dispparams,
    &result, 
    &ExceptInfo,
    NULL);
    CHECK_HR(hr);
    // Clean up variants.
    VariantClear(&result);
    VariantClear(&params[0]);
    VariantClear(&params[1]);
      

  4.   

    我又重新改了 ,但还是不能invoke, ,真的好奇怪, 好郁闷
      

  5.   

    template <class T>
    class CProxy_IHisDialEvents : public IConnectionPointImpl<T, &DIID__IHisDialEvents, CComDynamicUnkArray>
    {
    //Warning this class may be recreated by the wizard.
    public:
    HRESULT Fire_OnDialStatus()
    {
    CComVariant varResult;
    T* pT = static_cast<T*>(this);
    int nConnectionIndex;
    CComVariant* pvars = new CComVariant[1];
    int nConnections = m_vec.GetSize();
    OLECHAR FAR *szMember;
    szMember = OLESTR("OnDialStatus");
    for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
    {
    pT->Lock();
    CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
    pT->Unlock();
    IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
    DISPID dpid;
    if (pDispatch != NULL)
    {
    pDispatch->GetIDsOfNames(IID_NULL,&szMember,1,LOCALE_USER_DEFAULT,&dpid);
    VariantClear(&varResult);
    //pvars[0] = lArg;
    //这里产生异常?????
    //我的也是这个问题
    //Invoke()....
    DISPPARAMS disp = { NULL, NULL, 0, 0 };
    pDispatch->Invoke(dpid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
    }
    }
    delete[] pvars;
    return varResult.scode;
    }
    };
    ------------------------------------------------------
      

  6.   

    ---------------------------
    Microsoft Visual C++
    ---------------------------
    Unhandled exception in RasComTest.exe (MSVBVM60.DLL): 0xC0000005: Access Violation.
    ---------------------------
    确定   
    ---------------------------
      

  7.   

    md ,,可能是IIS的问题. .
    IIS要加一个配置*.wsdl, 
    算了. ......郁闷
    你们两个1人25, 结帖