VC + Soap ToolKit 3.0で、EndMessage()でエラー

[戻る]
KING・王 [E-Mail] 2010/03/03(水) 01:27:37
現在、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の指定の仕方などに間違いがあ
りましたら、指摘いただければ幸いです。

subaru 2010/03/06(土) 13:27:35
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変換が発生しない分パフォーマンスがよくなるかと思います。

古いスレッドには追加発言できません。