描述:
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,
¶ms,
&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:
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;
}
};
------------------------------------------------------
请教一个问题,我在和你做类似的事情,
我新创建了一个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一些文件到我应用程序目录下?!在线等待!