スポンサーサイト

公開日 : --/--/-- (--)
カテゴリ : スポンサー広告
<< ブログトップ >>

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

Keisuke's Logon Time Limiter 2.0 開発状況 (2010/07/12)

公開日 : 2010/07/12 (月)
コメント : 0 件 | カテゴリ : Keisuke's Logon Time Limiter
<< ブログトップ >>

Keisuke's Logon Time Limiter 2.0 では Windows 7 への対応強化も盛り込む予定です。

Beta 2 ビルド以降では Windows 7 から搭載されたジャンプリストを活用して、そこから Keisuke's Logon Time Limiter の機能へアクセスできる手段を提供する方針です。ところで、自作ソフトウェアでジャンプ リストに対応するには COM オブジェクトを使用する必要があるのですが、そのままでは Visual C++ 2005 Express + Windows SDK 6.0 では色々と無理なところがあります。

というのも、Windows SDK 6.0 は Windows Vista 対応版であるため、Windows 7 から追加された API やフラグは使うことができず、特にそれ以降に追加された CLSID 系フラグや ITaskbarList3 オブジェクトが使えないのはかなりの痛手です。(ジャンプ リストの制御で必要となる DestinationList クラスや EnumerableObjectCollection クラスは当然 Windows SDK 7.0 以降でなければ対応できません。)

そこで、プロジェクトに対してヘッダ ファイルのみ Windows SDK 7.1 (Windows 7 と .NET Framework 4.0 対応版) のものを使い、それ以外は今まで通り 6.0 のものを使うという対応を取りました。

しかし、それでも Windows 7 以降に追加された CLSID クラスは Windows SDK 6.0 付属のライブラリをそのまま使っているために未解決エラーでリンカが蹴ってしまうため、さらに以下の方法で回避しています。

・CLSID 型 (構造体) 変数を用意する
・目的の CLSID クラスが対応する GUID を調べる
・その GUID を基に先ほど用意した変数を初期化する
・初期化した変数を CoCreateInstance() API の第一引数に渡して COM オブジェクトにアクセスする

なお、CLSID 構造体 (厳密には GUID 構造体) は以下のようになっています。

typedef struct _GUID {
unsigned long Data1;
unsigned short Data2;
unsigned short Data3;
unsigned char Data4[8];
} GUID;

たとえば、DestinationList クラスの GUID は 77f10cf0-3db5-4966-b520-b7c54fd35ed6 になるので、この場合は、

CLSID (変数名) = {0x77f10cf0, 0x3db5, 0x4966, {0xb5, 0x20, 0xb7, 0xc5, 0x4f, 0xd3, 0x5e, 0xd6}};

で初期化し、それを渡せばよいことになります。こうすれば 2005 でも Windows 7 のジャンプリスト機能が活用できるようになるというわけです。ちなみに、EnumerableObjectCollection クラスの GUID は 2d3468c1-36a7-43b6-ac24-d3f02fd9607a なので、同じ要領で、

CLSID (変数名) = {0x2d3468c1, 0x36a7, 0x43b6, {0xac, 0x24, 0xd3, 0xf0, 0x2f, 0xd9, 0x60, 0x7a}};

として初期化すれば、EnumerableObjectCollection クラスも使えます。

ITaskbarList3 オブジェクト (関連を含む) は Windows SDK 7.0 から対応しているため、必ずそれ以降に付属するヘッダ ファイルを使用しないとコンパイルすらできなかったりします。特にオーバーレイ アイコンについては ITaskbarList3 オブジェクト経由で制御するため、同 7.0 以降のヘッダ ファイルを用いる必要があります。

上記の事情から、基本的に Windows SDK 6.0 のヘッダとライブラリを使いつつ、Windows 7 関連に関わる機能のみ Windows SDK 7.1 のヘッダ ファイルを使うという荒業を使っています。

それでも Windows XP 上では普通に動作してくれているのでデバッグ作業においては今のところ問題は発生していません。今回分かったこととしては Windows 7 のジャンプ リストやオーバーレイ アイコン機能を Visual C++ 2005 上で使うにはちょっと無理があるようだということですね。

ちなみに、オーバーレイ アイコンを使いたくなったのはタスクトレイが絡んでいたりします。というのも、タスクトレイに常駐しているアイコンは原則非表示となるために、残り時間がわからないという弊害が発生してしまうため、それを回避するべくこちらも使ってみよう…ということになったわけです。

また、Wiondos SDK 7.1 用ヘッダ ファイルを使っているのは Keisuke's Logon Time Limiter 本体のみで、それ以外は従来通り Windows SDK 6.0 用ヘッダとライブラリを引き続き使っています。

コメント一覧

コメントする















管理人のみ確認可能にする

| ブログトップ |

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