@egtraイグトランスの頭の中(のかけら)ActiveBasicを中心にプログラミングの話をぼちぼちと。Qiitaの8日目の記事です。初回(QueryInterfaceで増えるオブジェクト)で以下のことが分かりました。IStreamをQueryInterfaceするたびに異なるポインタが得られる。同じオブジェクトから得たIStreamから、IUnknownをQueryInterfaceすると同一のポインタが得られる。ここから、迂闊にIUnknownを介すると罠にはまるだろうと考えられます。それを以下のプログラムで試してみました。}関数fをご覧ください。仮引数のIStreamでReadを呼び出しています。その後、わざとIUnkonwnへQueryInterfaceし、そこからIStreamへ再びQueryInterfaceしています。そちらのIStreamで2回目のReadを実行しています。1でDOMDocumentのIStreamを渡すとこうなります。2回目のRead呼び出しでも、頭からの読み出しになってしまいました。IUnknownからIStreamをQueryInterfaceしている処理が新しいIStreamを取得することになっているためと説明できます。0に書き換えて、SHCreateMemStreamによるIStreamを渡した場合の結果がこれです。こちらは何度IStreamをQueryInterfaceしても同じであるため、続きが読み出せています。こちらが期待した結果です。<piyo/まとめです。MSXMLのDOMDocumentオブジェクトでは、IStreamをQueryInterfaceするたびに新しい従属的なオブジェクトを返します。そのため、そこからIUnknownにQueryInterfaceし、さらにIStreamをQueryInterfaceすると、同じポインタが得られません。このため、「IStreamからの読み出し処理をIUnknownで受け渡して複数の関数で実行する」という処理の場合、DOMDocumentのIStreamを渡すと期待どおり動きません。IXMLDOMDocument.saveで適当なIStreamに書き出してそちらを使うべきということになります。QueryInterfaceで毎回異なるポインタを返す(新しく従属的なオブジェクトを作って返す)こと自体は有用な場合もあるとは思います。このような罠が生じるので、状態を持つ内部オブジェクトを作って返すのは好ましくないと私は感じました。コメントをキャンセルメールアドレスが公開されることはありません。WPThemes.Info。