C++ アプリケーションでリモート サーバーから Web サービス (wcf サービスではない) を使用する必要があります。そして、このリンクで@Matt Davisが示した例に従いました。 アンマネージド C++ クライアント用の WCF サービスを作成します 。つまり、C++ DLL を使用して、マネージド c# WCF クライアントとアンマネージド C++ アプリケーションの間のギャップを埋めます。その実現可能性をテストするために、サービスがリモート サーバーによって提供されるレガシー Web サービスであることを除いて、ほぼすべてのコードをコピーし、すべての構成手順に従いました。以下は私の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 は、C# で String[] を返すメソッドの 1 つです。プロセスを簡略化するために、メソッド呼び出しで最初の要素のみを返します。以下は、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 です。私はこの分野に非常に慣れていないので、あなたの提案を本当に感謝しています。