0

C# から使用している ATL COM オブジェクトがあります。インターフェースは現在次のようになっています。

interface ICHASCom : IDispatch{
    [id(1), helpstring("method Start")] HRESULT Start([in] BSTR name, [out,retval] VARIANT_BOOL* result);
...
    [id(4), helpstring("method GetCount")] HRESULT GetCount([out,retval] LONG* numPorts);
...

    [id(7), helpstring("method EnableLogging")] HRESULT EnableLogging([in] VARIANT_BOOL enableLogging);
};

つまり、非常にシンプルなインターフェースです。また、送り返すイベントもいくつかあります。ここで、インターフェイスに何かを追加したいと思います。ATL には、現在構造体であり、次のように見えるいくつかの結果があります。文字列 ID; 文字列の要約; }; 構造体のすべてのメンバーは std::string です。C# に戻す必要があるこれらの配列があります。これを行う最善の方法は何ですか?

誰かがこう言うだろうと思います、「おい、std::string をそのように COM 経由で送信することはできない。もしそうなら、それでいいが、構造体を変更する最良の方法は何だ? std::string を BSTR に変更する?」 1) 構造体の配列 (BSTR または std::string を含む構造体) を渡すように IDL を設定します。2) SAFEARRAYS を使用する必要がある場合、SAFEARRAYS を構造体で埋める方法。

単純な型での使用を除いて、COM には詳しくありません。

4

1 に答える 1

1

ユーザー定義の構造は自動化インターフェースと互換性がありません。おそらく、入れ子になった配列または BSTR の 2 次元セーフ配列を作成できますが、より保守しやすい解決策は、構造を 3 つのプロパティを持つオートメーション オブジェクトとしてラップしてから、列挙子を持つコレクションとして配列をラップすることです。

IDL もオートメーションも、構造体のバイト アラインメントを定義しません。そのため、COM サーバーとクライアントの構造体のアライメントが異なる場合、互換性の問題が発生する可能性があります。たとえば、VB には 4 バイト アラインメントがありますが、Visual C++ の #import のデフォルトは 8 バイト アラインメントです。将来、スクリプトでインターフェイスを使用する可能性が少しでもある場合は、構造体の使用を避けてください。

推奨読書:

于 2010-05-06T00:41:45.423 に答える