我有一个WCF服务,它有这样的合同:(运营合同是OneWay)
[ServiceContract()]
public interface IEmpUpdate
{
[OperationContract(IsOneWay = true)]
void SendEmpUpdate(int _empid);
}
Run Code Online (Sandbox Code Playgroud)
我必须从COM DLL调用此SendEmpUpdate方法.我在网上搜索并找到了一些例子,但那是为了vb.我的COM组件是用C++开发的.我按照相同的步骤在C++中执行此操作.
我遵循的链接:
此链接说明了两种方法:
1.使用类型化合同来消费WCF服务2.使用MEX端点来消费WCF服务
我试过两种方式:(C++)
第二种方式(使用MEX端点使用WCF服务)请参阅以下代码:
如果我为SendEmpUpdate将OperationContract IsOneWay更改为false,则第二种方式可以正常工作.如果它的真实,Invoke方法失败,HRESULT值为0x80131502(它似乎像ArgumentOutOfRangeException使用HRESULT COR_E_ARGUMENTOUTOFRANGE)
//Importing the tlb:
#import "Employee.tlb" no_namespace named_guids
//Creating the moniker string:
LPTSTR moniker = L"service:mexaddress=net.tcp://localhost:11234/Employee/mex, "
L"address=net.tcp://localhost:11234/Employee, "
L"contract=IEmpUpdate, "
L"binding=nettcpEmpUpdate, ";
//Get the Object:
HRESULT hr = S_FALSE;
IDispatch* objWsc;
hr = CoGetObject(moniker, NULL, IID_IDispatch, (void**)&objWsc);
if (FAILED(hr))
{
Message(TEXT("Client: CoGetObject"), hr);
return(hr);
}
DISPID dispid;
BSTR pOperation = L"SendEmpUpdate";
hr = objWsc->GetIDsOfNames(
IID_NULL,
&pOperation, …Run Code Online (Sandbox Code Playgroud)