13

それぞれが実装する2つのWindowsサービスを実装しようとしていますが、それぞれが独自のgSoapインターフェースであり、両方とも各インターフェースのクライアントとサーバーです。したがって、私の問題は、両方のインターフェイス (メンバーを持つクラス) で同じデータ型を使用し、2 つの異なる名前空間を作成する soapcpp2.exe -q オプションを使用して C++ コードを生成することです。これは問題なく動作しますが、問題は名前空間の分離により、両方のインターフェイスで等しいはずのデータ型が異なるようになりましたが、名前空間を削除すると、共有データ型が両方のインターフェイスで同じ名前を持つため、競合が発生します。

"問題:

interface 1:
---
>class xsd__Address 
{ 
   char *email; 
   char *url; 
}; 

>int ns1__getAddress(xsd__Address& ret);

---
interface 2:
---
>class xsd__Address 
{ 
   char *email; 
   char *url; 
}; 

>int ns2__setAddress(xsd__Address& ret);

---

各ヘッダーを定義した後、soapcpp2.exe で次のようにコンパイルします。

soapcpp2.exe -qintf1 -n xxxx //インターフェイス 1 の場合

soapcpp2.exe -qintf2 -n xxxx //インターフェイス 2 の場合

したがって、両方のインターフェイス (インターフェイス 1 とインターフェイス 2) を使用するプロジェクトで、次のようなものが必要な場合:

intf1::Interface1 int1;
int1.endpoint="xxx";
intf1::ns__Address address;
int1.ns1__getAddress(address);

intf2::Interface1 int2;
int2.endpoint="xxx";
int2.ns2_setAddress(address); //this don't compile like i was expecting because to the compiler they are not the same object (and it is wright...)

質問:

2 つ以上のインターフェイス間でデータ型を共有することは可能ですか? はい?これはどのように達成されますか?

そうでない場合、これを実装するための最良の解決策は何ですか?

4

2 に答える 2

1

すでに 2 つの可能な解決策があります。 1. 名前空間を使用し、形式的に異なるデータ型を何らかの方法で処理します。2. WSDL ファイルをマージし、結果に対して gSOAP コンパイラを 1 回だけ実行します。

2015 年に数週間かけて、より良い解決策を見つけようとしましたが、何もありませんでした。

于 2016-11-21T23:06:01.400 に答える
1

最後に gSOAP (2008 年?) を使用しましたが、共有構造には柔軟性がありませんでした。2013年の今日、それが可能かどうかはコメントできません.

ただし、簡単な回避策として、2 つの WSDL を 1 つにマージして (たとえば、ビルドの一部として)、統合された SOAP スタックを生成することができます。

于 2013-11-10T11:38:23.860 に答える