正味の話が、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 2010だと[Web参照の追加]メニューさえ表示されない
やっぱり見捨てられた感があるが、Windowsフォームだとかは出来るのでMFC一択以外の場合はWindowsフォームで開発を考えるべきである。
しかし、他のライブラリや資産の関係上どうしてもMFCで続ける場合には次の方法で進めることが出来ました。
- Visual Studio 2008で作成したプロジェクトをアップグレードする。
- .disco/.wdsl/.discomapを手動で追加する。
2つの方法とも、Visual Studio 2010では[Web参照の更新]メニューが無いので、サービスクライアントとサービスを同時に開発している場合には向いていません。素直にVisual Studio 2008で開発することをお勧めします。
既にサービスに変更が無い場合は他社サービスの場合には、次の手順でプロジェクトに追加や移植することでWeb参照をMFCプロジェクトに追加することができます。
- Visual Studio 2008のプロジェクト内の[Web参照の追加]で追加した名前で作成されている、フォルダとヘッダーファイルを新しく作成したプロジェクトのフォルダー内にコピーします。(メソッドが多いサービスの場合には、.wsdlファイルとか手書きで作ると大変なので、別途ツールで作成するかVS2008で、あらかじめ作成しておいた方が楽です)
- [ソリューション エクスプローラー]でプロジェクトを選んで、右クリックで表示されたポップアップメニューから[追加|新しいフィルター]を選択します。
- [NewFilter](フォルダーアイコン)がプロジェクトに追加されます。
- 名前を変更(例:WebService1)して、[プロパティ]内の[一意の識別子]にWebサービスへのURL(例:http://service.domain.com/servicename/service.asmx)を入力します。
- フィルターのアイコンが変更されます。
- 追加した[WebService1]フィルターをマウスの右ボタンで選択して、[追加|既存の項目]で、コピーしておいた.discoファイルを参照するか、[新しい項目]で表示された[スタティック探索ファイル(.disco)]を追加します。
- 同様に、[.wsdl]と[.discomap]を追加します。
- [ソリューションエクスプローラー]の[ヘッダーファイル]に、コピーしておいたヘッダーファイルを追加します。
- [stdafx.h]に追加したヘッダーファイルへのインクルード宣言を追加します。
#include "WebService1.h"
- 実装したい.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サービスクライアントの開発ができるようになりました。