@egtraイグトランスの頭の中(のかけら)ActiveBasicを中心にプログラミングの話をぼちぼちと。Qiitaの19日目の記事です。COMインタフェースを実装するクラスを書いていると、どのアパートメントからでもマーシャリングせず直に呼び出しを受け付けられるものになることがあります。マーシャリングが邪魔だと思うことがあります。COMには、そんなオブジェクトを作成する手段が用意されています。Objectと名前が与えられました。Apartmentsなど、MSDNライブラリの従来のCOM関係の記事でもこの言葉が使われているようです。8で新しく追加されたIAgileObjectです。両者ともに実装するのが良いでしょう。IUnknownと同じ値を返せば良い。フリースレッドマーシャラに丸投げ。IUnknownと同じ値を返せば良い。フリースレッドマーシャラに丸投げ。}フリースレッドマーシャラの作成にはCoCreateFreeThreadedMarshaler関数を使います。この実引数には、CoCreateInstandeの2番目の実引数と同じく外側のオブジェクトへのポインタを渡します。QueryInterfaceでは、この2つを行います。IAgileObjectの要求に対して自身のオブジェクトを返します。IMarshalの要求に対してフリースレッドマーシャラを返します。IAgileObjectはメソッドを持たないインタフェースです。そのため、INoMarshalの場合(参考:前々回のマーシャル禁止のオブジェクト)と同じように、C++基底クラスに入れずに実装しています。実行結果は以下のようになります。11092この結果では、以下のことが示されています。Objectだと分かっているならわざわざCoGetInterfaceAndReleaseStreamなどでマーシャリングする必要はありません。直接ポインタをやりとりして平気です。Objectですが、そのことに起因する注意点もあります。メソッドが実行されるアパートメントが毎回異なる可能性があるため、C++などの言語でクラスとして実装する場合、メンバー変数にCOMインタフェースへのポインタを持つには注意が必要です。基本的には、適切にマーシャリングする必要があります。(C++/CX)などのマーシャリング処理をラップしたクラステンプレートが便利です。Objectであればそのままポインタを保持して問題ありません。従来のCOMでは、マーシャリングが必要なオブジェクトの多いので前者の注意点が目立ちます。Objectが大半であるため、ほとんど気にする必要がなくなってしまいました。Windowsストア・Phoneアプリ向けAPI)の言葉が登場しています。Objectが第一級に抜擢されたためです。APIではクラスの実装形態の1つとして明確に位置づけられました。(WinMD)上で、クラスに対する属性として表現されます。MarshalingBehaviorAttribute属性に以下のMarshalingType列挙体が使用されます。Object、Standardが従来のCOM同様のマーシャリングとなります。Objectだそうです。ASTAのUIスレッドが1つのみ、それ以外はすべてMTAであることも併せて考えれば、Windowsストアアプリにおいては概ね以下のように理解すれば十分ということになります。APIは関与しないこのように、Windowsストア・Phoneアプリ作成においては、アパートメントやマーシャリングなどCOMのことをあまり知らなくてもいいようにしようと工夫していることが窺えます。Objectが第一級と表現したわけです。APIアプリであるデスクトップアプリでも便利に使えます。Object化して、マーシャリングを考えずに済むようにするのが良いと思います。ブロック処理が含まれていればちょっと考え物ですね。Object化するか、時と場合によります。Object(フリースレッドマーシャラー)の話でした。コメントをキャンセルメールアドレスが公開されることはありません。WPThemes.Info。