У меня есть служба WCF, у которой есть такой контракт: (контракт операции OneWay)
[ServiceContract()]
public interface IEmpUpdate
{
[OperationContract(IsOneWay = true)]
void SendEmpUpdate(int _empid);
}
Мне нужно вызвать этот метод SendEmpUpdate из COM DLL.Я искал в Интернете и нашел несколько примеров, но это было для VB.Мой COM-компонент был разработан на C ++.Я проделал те же шаги, чтобы сделать это в C ++.
Ссылка, по которой я следовал:
http://pieterderycke.wordpress.com/2010/10/05/using-the-wcf-service-moniker-to-communicate-between-legacy-com-applications-and-new-net-applications/
Эта ссылка объясняет два способа сделать это:
1. Использование службы WCF с использованием типизированного контракта 2. Использование службы WCF с использованием конечной точки MEX
Я пробовал обоими способами: (C ++)
2-й способ (Потреблениеслужба WCF, использующая конечную точку MEX), см. следующий код:
2-й способ работает нормально, если я изменяю OperationContract IsOneWay на false для SendEmpUpdate.Если это правда, метод 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,
1,
LOCALE_SYSTEM_DEFAULT,
&dispid);
if (FAILED(hr))
{
Message(TEXT("Client: GetIDsOfNames"), hr);
return(hr);
}
DISPPARAMS empIDs;
VARIANTARG varData[1];
empIDs.rgvarg = &varData[0];
VariantInit(&empIDs.rgvarg[0]);
empIDs.rgvarg[0].vt = VT_I4;
empIDs.rgvarg[0].lVal = 564234;
empIDs.cArgs = 1;
empIDs.cNamedArgs = 0;
empIDs.rgdispidNamedArgs = NULL;
VARIANT result;
//VariantInit(&result);
UINT argErr = 0;
EXCEPINFO pExcepInfo;
memset(&pExcepInfo, 0, sizeof(EXCEPINFO));
hr = objWsc->Invoke(
dispid,
IID_NULL,
LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD,
&empIDs, &result, &pExcepInfo, &argErr);
if (FAILED(hr))
{
Message(TEXT("Client: Invoke"), hr);
return(hr);
}
1-й метод (использование службы WCF с использованием aнабранный контракт) см. следующий код:
В первом методе CoGetObject не работает objEmp имеет значение null.
//Importing the tlb:
#import "Employee.tlb" no_namespace named_guids
//Creating the moniker string:
LPTSTR moniker = L"address=net.tcp://localhost:11234/Employee, "
L"contract={52DEEE76-0BAF-31D8-A48B-DA2C50FA2753}, "
L"binding=nettcpEmpUpdate ";
//Get the Object:
HRESULT hr = S_FALSE;
IEmpUpdate* objEmp;
hr = CoGetObject(moniker, NULL, __uuidof(IEmpUpdate), (void**)&objEmp);
if (FAILED(hr))
{
Message(TEXT("Client: CoGetObject"), hr);
return(hr);
}
Вопросы:
- Если 2-й способ установить значение IsOneWay в значение true, это не помогает, как решить эту проблему?
- Почему 1-й способ CoGetObject завершается ошибкой?
- Если имеетсяспособ работает 1 или 2, это было бы очень полезно.В сети нет примеров.