single.php

C++からWebサービスに接続する

正味の話が、Visual StudioのC++プロジェクトのメニューで[Web参照の追加]ができるかという話。
VC++はVisual Studioのバージョンアップの度に「取り残された感」が強くて、C#やASP.NETのように出来ることが増えていくのではなく、制限されていく方向にあるのは間違いない。(VS2003.NETの時にはWebサービスのテンプレートがあったのにVS2005では、あっさり無くなってしまったり)

まず、C++プロジェクトで[Web参照の追加]メニューを有効にするためには、次の条件が必要になる。

  • プロジェクトの文字セットを[Unicode文字セットを使用する]
    変更する場所[プロジェクト|プロパティ|構成プロパティ|文字セット]
  • 共通言語ランタイム サポートを[共通言語ランタイム サポート(/clr)]
    変更する場所[プロジェクト|プロパティ|構成プロパティ|共通言語ランタイム サポート]
  • ランタイムライブラリを[マルチスレッド デバッグ DLL(/MDd)またはマルチスレッド DLL(/MD)]
    変更する場所[プロジェクト|プロパティ|構成プロパティ|C/C_++|コード生成|ランタイム ライブラリ]

上記のプロジェクト設定の場合に[Web参照の追加]メニューが有効になりビルドが通る(Visual Studio 2008の話)

Visual Studio 2008の場合
vs2008-web-reference

同じ設定をしても、Visual Studio 2010だと[Web参照の追加]メニューさえ表示されない

vs2010-web-reference

やっぱり見捨てられた感があるが、Windowsフォームだとかは出来るのでMFC一択以外の場合はWindowsフォームで開発を考えるべきである。

しかし、他のライブラリや資産の関係上どうしてもMFCで続ける場合には次の方法で進めることが出来ました。

  1. Visual Studio 2008で作成したプロジェクトをアップグレードする。
  2. .disco/.wdsl/.discomapを手動で追加する。

2つの方法とも、Visual Studio 2010では[Web参照の更新]メニューが無いので、サービスクライアントとサービスを同時に開発している場合には向いていません。素直にVisual Studio 2008で開発することをお勧めします。

既にサービスに変更が無い場合は他社サービスの場合には、次の手順でプロジェクトに追加や移植することでWeb参照をMFCプロジェクトに追加することができます。

  1. Visual Studio 2008のプロジェクト内の[Web参照の追加]で追加した名前で作成されている、フォルダとヘッダーファイルを新しく作成したプロジェクトのフォルダー内にコピーします。(メソッドが多いサービスの場合には、.wsdlファイルとか手書きで作ると大変なので、別途ツールで作成するかVS2008で、あらかじめ作成しておいた方が楽です)
  2. [ソリューション エクスプローラー]でプロジェクトを選んで、右クリックで表示されたポップアップメニューから[追加|新しいフィルター]を選択します。
  3. [NewFilter](フォルダーアイコン)がプロジェクトに追加されます。
  4. 名前を変更(例:WebService1)して、[プロパティ]内の[一意の識別子]にWebサービスへのURL(例:http://service.domain.com/servicename/service.asmx)を入力します。
  5. フィルターのアイコンが変更されます。
  6. 追加した[WebService1]フィルターをマウスの右ボタンで選択して、[追加|既存の項目]で、コピーしておいた.discoファイルを参照するか、[新しい項目]で表示された[スタティック探索ファイル(.disco)]を追加します。
  7. 同様に、[.wsdl]と[.discomap]を追加します。
  8. [ソリューションエクスプローラー]の[ヘッダーファイル]に、コピーしておいたヘッダーファイルを追加します。
  9. [stdafx.h]に追加したヘッダーファイルへのインクルード宣言を追加します。
    #include "WebService1.h"
    
  10. 実装したい.cppファイルに、Webサービスの処理を実装します。
    webservice1::servicename^ svc = gcnew webservice1::servicename();
    System::Net::CookieContainer^ cookiecontainer = gcnew System::Net::CookieContainer();
    svc->CookieContainer = cookiecontainer;
    System::Data::DataSet^ svcres = svc->MethodName();
    

とりあえず、この方法でVisual Studio 2010のMFCプロジェクトでもWebサービスに接続して処理を行うWebサービスクライアントの開発ができるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です