現在、WinXP上で、VC++2008(MFC)とSoap Toolkit3.0を用いて、Soapで通信をするクライ
アントソフトを作成しようとしています。
Helpやネット上の資料を見て、以下のようなsoap通信用のクラスを作成しました。
このクラスのオブジェクトを作成して、run()関数をコールすると、コメントにあるよう
に、EndMessage()をコールすると、例外が発生してしまいます。
一応、ネット上で探したところ、海外のサイトなどで、同様のエラーが発生するというよ
うな内容は見つけたのですが、回答がついておらず、残念ながら、参考にはなりませんで
した。
こちらをご覧の識者の方で、何かご存知のことがあれば、教えていただけないでしょう
か?
---- test.h ----
#pragma once
class CSoapCom
{
public:
CSoapCom(void);
~CSoapCom(void);
void run();
};
---- test.h (ここまで)----
---- test.cpp ----
#include StdAfx.h
#include SoapCom.h
#include stdio.h
#import msxml4.dll
using namespace MSXML2;
#import C:\\Program Files\\Common Files\\MSSoap\\Binaries\\mssoap30.dll \
exclude(IStream, IErrorInfo, ISequentialStream, _LARGE_INTEGER, \
_ULARGE_INTEGER, tagSTATSTG, _FILETIME)
using namespace MSSOAPLib30;
CSoapCom::CSoapCom(void)
{
CoInitialize(NULL);
}
CSoapCom::~CSoapCom(void)
{
CoUninitialize();
}
void CSoapCom::run()
{
ISoapSerializerPtr Serializer;
ISoapReaderPtr Reader;
ISoapConnectorPtr Connector;
HRESULT hRet = 0x00;
hRet = Connector.CreateInstance(__uuidof(HttpConnector30));
Connector->Property[EndPointURL]
= http://www.iwebmethod.net/helloworld/HelloWorld.asmx HTTP/1.1;
hRet = Connector->Connect();
Connector->Property[SoapAction] = uri:HelloWorld;
hRet = Connector->BeginMessage();
hRet = Serializer.CreateInstance(__uuidof(SoapSerializer30));
hRet = Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
hRet = Serializer->StartEnvelope(",STANDARD, ");
hRet = Serializer->StartBody(");
hRet = Serializer->StartElement(HelloWorld, http://tempuri.org/, ",");
hRet = Serializer->EndElement();
hRet = Serializer->EndBody();
hRet = Serializer->EndEnvelope();
hRet = Connector->EndMessage(); /* ここで例外が発生 */
Reader.CreateInstance(__uuidof(SoapReader30));
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), ");
}
---- test.cpp(ここまで) ----
なお、通信先は、<< http://www.iwebmethod.net>>というサイトを勝手に接続させていた
だいております。
C++/CLIの形にして、web参照で、指定した場合、上記のサイトとの通信はできることは確
認しましたので、正しく実装すれば、通信は可能だと考えております。
.NET Frameworkを使用すると、簡単にできるのですが、諸事情により、今回は、.NET
Frameworkを使用せずに、VC++とSoap Toolkitで実装したいと考えております。
また、私がSoapやcomの知識が乏しく、comの使い方やsoapの指定の仕方などに間違いがあ
りましたら、指摘いただければ幸いです。
EndPointURL = http://www.iwebmethod.net/helloworld/HelloWorld.asmx
SoapAction = http://tempuri.org/HelloWorld
・・・かなあ?
>また、私がSoapやcomの知識が乏しく、comの使い方やsoapの指定の仕方などに間違いがあ
>りましたら、指摘いただければ幸いです。
SOAPの方はC#でしか使ったことないので詳しくはないですが
要求サンプルの内容で設定内容がわかるのではないでしょうか。
COMについてはCoInitialize/CoUninitializeの呼び出しはスレッド毎でよく
クラスのコンストラクタ/デストラクタで行うと他の部分で影響が出るかもしれません。
#MFCなのでそもそもCoInitializeされてるかも?
#importで生成されたクラスの例外は_com_error型でキャッチします。
あと文字セットがUnicodeであれば、パラメーターもUnicode文字列を渡した方が
ANSI→Unicode変換が発生しない分パフォーマンスがよくなるかと思います。