Мне нужно использовать веб-сервис (не сервис wcf) с удаленного сервера в моем приложении c ++. И я следовал примеру, приведенному @Matt Davis в этой ссылке.
Создать службу WCF для неуправляемых клиентов C ++
то есть используйте c ++ dll для преодоления разрыва между управляемым клиентом c # WCF и неуправляемым приложением c ++.
Чтобы проверить его осуществимость, я почти скопировал весь код и выполнил все этапы настройки, за исключением того, что служба является устаревшей веб-службой, предоставляемой удаленным сервером. Ниже мой bridge.cpp
#include "bridge.h"#include "Ibridge.h"#include<string>
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace System::ServiceModel;
using namespace System::ServiceModel::Channels;
std::string Ibridge::getSupportCity(std::string name)
{ std::string rv;
Binding^ binding = gcnew WSHttpBinding();
EndpointAddress^ address = gcnew EndpointAddress(gcnew String("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"));
client::ServiceReference1::WeatherWebServiceSoapClient^ client1 = gcnew client::ServiceReference1::WeatherWebServiceSoapClient(binding, address);
try {
String^ message=client1->getSupportCity(gcnew System::String(name.c_str()))[0];
client1->Close();
IntPtr ptr = Marshal::StringToHGlobalAnsi(message);
rv = std::string(reinterpret_cast<char *>(static_cast<void *>(ptr)));
Marshal::FreeHGlobal(ptr);
} catch (Exception ^) {
client1->Abort();
}
return rv;
}
getSupportCity — один из методов, который возвращает String [] в c #, и чтобы упростить процесс, я возвращаю только его первый элемент при вызове метода. Ниже, как я назвал метод в приложении MFC.
void CMFCappDlg::OnBnClickedButton1()
{
std::string cities = Ibridge::getSupportCity("ALL");
AfxMessageBox(CString(cities.c_str()));
}
Я почти уверен, что при выполнении кода исключение 0xE0434352 генерируется в первой строке раздела «try» (т.е. когда вызывается getSupportCity), и код переходит прямо к части «catch».
Моя среда программирования — win7 64bit, vs2010 и .NET 4.0. Я очень новичок в этой области и буду очень признателен за ваши предложения.
Задача ещё не решена.
Других решений пока нет …