スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

お忍びリネーム改造・続き2

実は昨日から仕事なんですが、その前日にネットで爪切りの情報を探していて夜更かししてしまったため、帰ってご飯を食べたらすぐ寝てしまいました。切れ味だけならニッパータイプのものが良さそうなんですが、値段が結構するのと子供にも使うので安全性はどうなんだろうと考えてしまいます。切れ味を良くするには刃の噛み合わせの精度が求められるようなんですが、評判の良いメーカーの爪切りに爪をキャッチするカバーが付いていないものの方が多いのは、ひょっとして爪をカバーの方向に飛ばすために噛み合わせを多めに取ってあるんじゃ?とかいろいろ考えてしまって眠れなくなってしまいました。(^^;

話は変わって、プラスマイナスゼロ(?)のポップアップトースターの購入許可が降りました。(^^)/
GW中に百貨店で見つけたんですが、シンプル且つ場所を取らないのがいいですね。また、購入して使いましたら感想を書こうと思います。

さて、今日はあまり夜更かしもできないので、IUnknownの実装だけ済ませてしまおうかと思います。
最初に簡単なAddRefとReleaseから。私が参照カウンタで迷うのはsigned longにするのか、unsigned longにするのかですね。書籍を4冊調べてみたところ、2対2ですね。AddRefとReleaseは参照カウンタを戻り値(ULONG)として返しますが、その値はテスト目的以外には使用しないようにという注意があります。それでも戻り値の型に合わせるとすればULONGでしょうかね?正確な値を返さなくても良い、実装の詳細という風に考えればどちらでも良いのかもしれません。今回はULONGとしておきます。

ところが世の中うまく行かないもので、AddRef、Releaseをマルチスレッドを意識した作りにする場合、InterlockedIncrement、InterlockedDecrementを使用しますが、この引数と戻り値がLONG*とLONGなんですよね。で、先ほどの書籍を見てみると、ULONGにしている2冊の書籍はInterlockedIncrementとInterlockedDecrementを使ってないんですね。うーん、LONGにしているのはここでのキャストを避けるため?やっぱりLONGにしよっと。(^^;
Releaseで気をつけることは、参照カウンタが0になって自分自身を削除した際に、削除したインスタンスのメンバ変数にアクセスしないことですよね。ローカル変数に待避する方法もありますが、私はどこかで見た以下のやり方にしてます。

if (InterlockedDecrement(&m_cRef) == 0)
{
  delete this;
  return 0;
}
return m_cRef;

あとはQueryInterfaceですね。このCShellExtensionのQueryInterfaceで対応すべきは

・IUnknown
・IShellExtInit
・IContextMenu

の3つでしょうか。書籍「Essential COM」ではテーブルにインターフェイスを格納する方法が紹介されており、ATLでもそうなっているらしいんですが、普通にif文でいきます。
COMには一定のIUnknownを返すというルールがありますので、IUnknownが要求された場合、今回はIShellExtInit(のIUnknown)を返すことにします。関数の先頭で*ppvObjectにNULLにすることを推奨する書籍もあります。今回は、サポートしないインターフェイスが要求された場合に*ppvObjectにNULLをセットし、E_NOINTERFACEを返すことにします。

if (riid == IID_IUnknown || riid == IID_IShellExtInit)
{
  *ppvObject = static_cast<IShellExtInit*>(this);
}
else if (riid == IID_IContextMenu)
{
  *ppvObject = static_cast<IContextMenu*>(this);
}
else
{
  *ppvObject = NULL;
  return E_NOINTERFACE;
}

reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();

return S_OK;

こんな感じで大丈夫でしょうか?(^^;
今日はここまでにしておきます。次はクラスファクトリですけど、ちょっと迷ってることがありますので、すんなり進みますかどうか。
関連記事

comment

Secret

カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
カテゴリー
最近の記事
最近のコメント
タグ

カメラ GH2 GH3 

ブログ内検索
月別アーカイブ
RSSフィード
プロフィール
●オンラインソフト作家。しかし長らく活動休止中。
ソフトウェア

●Dさんの長押しIME起動2
●IME+ (仮称)

・Dさんの長押しIME起動。
・Dさんの日本語じゃなきゃイヤン。
・Dさんの名前変更お手伝い。
・Dさんのダイヤルアップ接続お手伝い。
・DさんのWindows終了お手伝い。

・お忍びランチャー。
・お忍びリネーム。
・デジくいっくサーチ!
・Simple Remote
・計算王?

※過去の開発ソフトの一部はリンク先からダウンロードできます。

リンク
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。