1

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 です。私はこの分野に非常に慣れていないので、あなたの提案を本当に感謝しています。

4

0 に答える 0