RPCサーバーとして機能するWindowsシステムサービスと、対応するクライアントを両方ともC++で実装しています。プレーンなWindowsRPC機能を使用しています。
RPCクライアントからサーバーへの文字列の受け渡しは簡単です。次のように、IDLファイルで関数パラメータを宣言するだけです。
[in, string] wchar_t* myString
MIDLはメモリ割り当ての魔法を処理します。御馳走のように動作します。
変更されたクライアント文字列を返すことも簡単です。
[in, out, string] wchar_t* myString
ただし、クライアント側で文字列のサイズを適切に設定する必要があります。
問題:
サーバーからクライアントに文字列を返す必要があります。クライアントでそれらがどれくらい大きくなるかわからないので、クライアントでのメモリ割り当てはオプションではありません。
非常に大量のメモリ、たとえば10Kを割り当てることができます。これは、サーバーが返す可能性のあるすべての文字列に十分な量です。しかし、それはリソース(メモリ、ネットワーク)の膨大な浪費であり、サーバーがより大きな文字列を返す必要がないことを私はまだ確信できません。
私が試したこと:
他にも、Microsoftのstroutサンプルで使用されている手法を試しました。初めてRPC関数を呼び出すと機能しましたが、2回目に呼び出すとサーバーがクラッシュしました。