VC + Soap ToolKit 3.0で、EndMessage()でエラー – プログラミング – Home

通知
すべてクリア

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


KING・王
 KING・王
(@KING・王)
ゲスト
結合: 15年前
投稿: 1
Topic starter  

現在、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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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変換が発生しない分パフォーマンスがよくなるかと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました