Windows Vista(製品版)のAPI実装はまだ未完成?!

test72.gif
Windows Vistaから追加されたAPIの1つのSHOpenWithDialogがある。これは「ファイルを開くプログラムの選択」ダイアログを表示するために用意された。ちょっと前まではAPI名が「OpenAsDialog」となっていたが、SHOpenWithDialogに変更されている。

このAPIでは引数にOPENASINFO構造体を利用する。この構造体はメンバ変数としてTCHAR*型が利用されているが...実際にテストしたところUnicodeしか受け付けない。そのため下に用意したテストコードのように(TCHAR*)でキャストする必要がある。

また、実行時には図のようなダイアログが表示される。しかし、プログラムを選択しても指定したファイルは開かない。SHOpenWithDialogの戻り値はS_FALSEが返る(この値は成功を示すので戻り値をSUCCEEDED(hr)のようにしてチェックできないことに注意!)。

ファイルが開かないのは単純にSHOpenWithDialogの使い方を間違えているだけかもしれない。しかし以上のことを考えてみると、Windows VistaのAPI実装にはまだ未完成の部分があるのかもしれない。

#include "shlobj.h"

bool	Test(void)
{
	HMODULE	hModule;
	HRESULT	hr;

	HRESULT (CALLBACK* pfnSHOpenWithDialog)(HWND hwndParent,POPENASINFO poainfo);

	hModule = ::LoadLibrary(_T("shell32.dll"));
	if(hModule == NULL)
		return	false;

	//MSDNではAPI名が「OpenAsDialog」のことがあるが、VistaではSHOpenWithDialogのみ実装されている
	(*(FARPROC*)&pfnSHOpenWithDialog) = ::GetProcAddress(hModule,"SHOpenWithDialog");

	if(pfnSHOpenWithDialog)
	{
		OPENASINFO	sInfo;

		::ZeroMemory(&sInfo,sizeof(OPENASINFO));
		sInfo.pcszFile = (TCHAR*)L"c:\\aa.txt";		//Unicodeで指定
		sInfo.pcszClass = NULL;
		sInfo.oaifInFlags = OAIF_ALLOW_REGISTRATION;

		//S_FALSEが返ることがある!
		hr = pfnSHOpenWithDialog(NULL,&sInfo);
	}
	else
		hr = E_FAIL;

	::FreeLibrary(hModule);

	return	(hr == S_OK) ? true : false;
}

プロジェクトファイルをダウンロード


カテゴリー「コラム」 のエントリー