2017-01-01から1年間の記事一覧

ショートカットにおけるファイルの実体参照解決の順番

ショートカットを作成するプログラムのテストをしているとき、ショートカットの実体参照に優先順位があることに気がついた。ショートカット内のプログラムへの実体参照はIDLISTとPathの2つがある。 ショートカットの実行では、まずIDLISTが参照され、IDLIST…

ドロップターゲットのC++による実装の例

ドロップターゲットをC++で実装する例ドロップを抽象化するクラス。 動的生成で管理するならinitの内容をコンストラクターに移動するのもありだろう。 class TDropTarget; class TMyDrop { friend TDropTarget; private: HWND FHwnd; TDropTarget* FDropTarg…

Shell IDList Arrayについて

クリップボードフォーマットにおいて、Shell IDList Arrayを用いた通信について記事が少ないので一言。CIDAのフォーマットの定義は以下の通りだ。 typedef struct _IDA { UINT cidl; // IDLISTの数 UINT aoffset[1]; // IDLIST構造体のリスト } CIDA, * LPID…

Crypto APIによる暗号化

Crypto APIによる暗号化は、ちょっとした用途で暗号化強度がさほど必要でない場合に便利だ。 今回は文字列を暗号化・復号化するルーチンのサンプルを提示する。 もっと強度が必要な場合には、Cryptography API: Next Generationを用いるとよいようだ。 こち…

deleteをなくすには

deleteコードを減らすことは、複雑なコードの保守やリソースリークの観点で望ましい。下のようなコードでdeleteを消したい。 なお、new[]で確保した配列は、delete[]で削除しなければいけないことに注意。 class C { public: char* buf; unsigned int size; …

vectorとunique_ptr その3

vectorはコピーを使う、だからauto_ptrとおなじくunique_ptrは使えない。 以下のコードはコンパイルエラーが発生する。 vector<unique_ptr<C> > v; v.push_back( unique_ptr<C>( new C ) ); まれに、このコードをおすすめするHPが見られるが、コンパイルできるコンパイラーが</c></unique_ptr<c>…

vectorとunique_ptr その2

前回はコピーすべきところでムーブすべきではないことがわかった。 コードはshared_ptrを用いることで、すべてがうまくいくようになる。 class C { public: shared_ptr<int> d; C() : d(new int(0)) {} C( const int n ) : d(new int(n)) {} // コピーコンストラ</int>…

vectorとunique_ptr その1

vectorとunique_ptrの相性は悪い。 vectorはコピーが伴うものだし、unique_ptrはコピーコンストラクタを持たない。 以下のようなコードを考えてみる。 class C { public: int d; C() : d(0) {} C( const int n ) : d(n) {} ~C() {} }; void test_code() { ve…