プロジェクトでは、Windows プラットフォームで gsoap クライアントを作成する必要があります。MinGw g++ を使用しています。soap...Proxy.h および .cpp ファイルを受け取るために、-j オプションを使用してコードを生成しました。
入力 ( ns2 _getSMSByTimeSpan) パラメーターと応答 ( ns2 _getSMSByTimeSpanResult) パラメーターの両方が複合型である Web サービスに要求を送信したいと考えています。入力パラメーターには、2 つの time_t 変数で構成される別の complexType (ns2__TimeSpan) が含まれています。wsdl では xsd:dateTime として定義されています。これらの 2 つの time_t 変数を設定しようとしましたが、失敗しました。アクセス方法がわからないだけです。生成されたファイルのコメントはあまり役に立たず、グーグルで答えを見つけることもできませんでした。
これは、クラスns2 _getSMSByTimeSpan および ns2__TimeSpan が soapStub.h でどのように見えるかです。
class SOAP_CMAC _ns2__getSMSByTimeSpan
{
public:
std::string AccountKey; /* required element of type xsd:string */
ns2__TimeSpan *TimeSpan; /* required element of type ns2:TimeSpan */
struct soap *soap; /* transient */
public:
virtual int soap_type() const { return 17; } /* = unique id SOAP_TYPE__ns2__getSMSByTimeSpan */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
_ns2__getSMSByTimeSpan() { _ns2__getSMSByTimeSpan::soap_default(NULL); }
virtual ~_ns2__getSMSByTimeSpan() { }
};
class SOAP_CMAC ns2__TimeSpan
{
public:
time_t *StartDate; /* optional element of type xsd:dateTime */
time_t *EndDate; /* optional element of type xsd:dateTime */
struct soap *soap; /* transient */
public:
virtual int soap_type() const { return 11; } /* = unique id SOAP_TYPE_ns2__TimeSpan */
virtual void soap_default(struct soap*);
virtual void soap_serialize(struct soap*) const;
virtual int soap_put(struct soap*, const char*, const char*) const;
virtual int soap_out(struct soap*, const char*, int, const char*) const;
virtual void *soap_get(struct soap*, const char*, const char*);
virtual void *soap_in(struct soap*, const char*, const char*);
ns2__TimeSpan() { ns2__TimeSpan::soap_default(NULL); }
virtual ~ns2__TimeSpan() { }
};
これまでの作業: gsoap クラスのインスタンスを作成し、使用する complexTypes を作成してインスタンス化しています。
#include "soapSMSGateBindingProxy.h"
#include "SMSGateBinding.nsmap"
#include <iostream>
SMSGateBindingProxy instance;
ns2__TimeSpan *timeSpan;
size_t *timeSpanSize = new size_t;
*timeSpanSize = sizeof(ns2__TimeSpan);
timeSpan = (ns2__TimeSpan*)
soap_instantiate(instance.soap,
SOAP_TYPE_ns2__TimeSpan,"","",
timeSpanSize);
_ns2__getSMSByTimeSpan *smsByTimeSpan;
size_t *smsByTimeSpanSize = new size_t;
*smsByTimeSpanSize = sizeof(_ns2__getSMSByTimeSpan);
_ns2__getSMSByTimeSpanResult *smsResult;
size_t *smsResultSize = new size_t;
*smsResultSize = sizeof (_ns2__getSMSByTimeSpanResult);
smsByTimeSpan = (_ns2__getSMSByTimeSpan*)
soap_instantiate(instance.soap,
SOAP_TYPE__ns2__getSMSByTimeSpan,"","",
smsByTimeSpanSize);
smsResult = (_ns2__getSMSByTimeSpanResult*)
soap_instantiate(instance.soap,
SOAP_TYPE__ns2__getSMSByTimeSpanResult,"","",
smsResultSize);
delete smsByTimeSpanSize;
delete smsResultSize;
次に、smsByTimeSpan->TimeSpan->StartDate の値を設定しようとしましたが、どのようなアプローチを試みても、クライアントがクラッシュします。
struct tm test;
test.tm_hour = 0; test.tm_min = 0; test.tm_sec = 0;
test.tm_year = 2013 - 1900; test.tm_mon = 8; test.tm_mday = 28;
// cout << mktime(&test) << timeSpan->StartDate << endl; //trying to access the StartDate value crashes it
// *smsByTimeSpan->TimeSpan->StartDate = mktime(&test);
// smsByTimeSpan->TimeSpan->soap_put(instance.soap, "2013-06-28 08:00:00", "2013-12-02 15:05:00");
// timeSpan.soap_put(instance.soap, "2013-12-02T14:10:03+02:00", "2013-12-02T14:50:03+02:00");
smsByTimeSpan->TimeSpan = timeSpan; //this works
*smsByTimeSpan->TimeSpan = mktime(&test); //this crashes
誰か教えてください、私が間違っていることはありますか? または、timeSpan->StartDate 値にデータを正しく入力する方法を教えてください。
前もって感謝します