EternalWindows
シェル拡張 / Infotip ハンドラ
サンプルはこちら

Infotip ハンドラは、特定の拡張子を持ったファイルに独自のツールチップを表示する場合に使用します。 通常、ファイルに関連するツールチップは、そのファイルの種類やサイズを表示しますが、 Infotip ハンドラを使用すればこれを変更することができます。

Infotip ハンドラのオブジェクトは、IQueryInfoとIPersistFileを実装する必要があります。 IQueryInfoは、チップに表示する文字列を受け取るために使用し、 IPersistFileはファイル名を受け取るために使用します。

class CQueryInfo : public IQueryInfo, public IPersistFile
{
public:
	STDMETHODIMP QueryInterface(REFIID riid, void **ppvObject);
	STDMETHODIMP_(ULONG) AddRef();
	STDMETHODIMP_(ULONG) Release();
	
	STDMETHODIMP GetInfoTip(DWORD dwFlags, LPWSTR *ppwszTip);
	STDMETHODIMP GetInfoFlags(DWORD *pdwFlags);
	
	STDMETHODIMP GetClassID(CLSID *pClassID);
	STDMETHODIMP IsDirty();
	STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode);
	STDMETHODIMP Save(LPCOLESTR pszFileName, BOOL fRemember);
	STDMETHODIMP SaveCompleted(LPCOLESTR pszFileName);
	STDMETHODIMP GetCurFile(LPOLESTR *ppszFileName);

	CQueryInfo();
	~CQueryInfo();

private:
	LONG  m_cRef;
	WCHAR m_szInfotip[256];
};

GetInfoFlagsからGetInfoTipまでがIQueryInfoのメソッドであり、 GetClassIDからGetCurFileまでがIPersistFileのメソッドになります。 Windows Vista以降では、IPersistFileではなくIInitializeWithFileなどを実装するべきですが、 下位互換性の事を考えてIPersistFileを実装するようにしています。

IPersistFileは、チップの表示対象となるファイル名を受け取るために継承しているため、 呼ばれるメソッドはLoadだけになります。

STDMETHODIMP CQueryInfo::Load(LPCOLESTR pszFileName, DWORD dwMode)
{
	lstrcpyW(m_szInfotip, L"My Infotip");

	return S_OK;
}

メンバ変数であるm_szInfotipにチップとして表示したい文字列を格納しています。 実際の開発では、pszFileNameで表されるファイルからデータを読み取り、 そのデータを基に文字列を作成することになるでしょう。

LoadがS_OKを返した場合は、GetInfoTipが呼ばれることになります。

STDMETHODIMP CQueryInfo::GetInfoTip(DWORD dwFlags, LPWSTR *ppwszTip)
{
	if (!ppwszTip)
		return E_POINTER;

	*ppwszTip = (LPWSTR)CoTaskMemAlloc((lstrlenW(m_szInfotip) + 1) * sizeof(WCHAR));
	lstrcpyW(*ppwszTip, m_szInfotip);

	return S_OK;
}

ppwszTipにチップとして表示したい文字列をコピーすることになります。 まず、ppwszTipが文字列を受け取れるようにCoTaskMemAllocでメモリを確保し、 これに対して予め保存しておいたm_szInfotipの中身をコピーします。 GetInfoTipの後にはGetInfoFlagsが呼ばれますが、E_NOTIMPLを返すだけで構いません。

Infotip ハンドラを登録するには、次に示すレジストリキーを作成することになります。

HKEY_CLASSES_ROOT
  <特定の拡張子>
    shellex
      {00021500-0000-0000-C000-000000000046} (既定) = オブジェクトのCLSID

Infotip ハンドラのDLLは、チップを表示すべき段階になるとシェルにロードされ、 チップの表示が終了するとアンロードされます。


戻る