関数の種類によって異なります。
プレーンな (非 COM) 関数の場合、唯一の方法はLoadLibrary
andを使用することGetProcAddress
です。どちらかが失敗した場合、OS にその機能がないことがわかります。既存の関数シグネチャを複製する関数ポインターの関数ポインター型宣言を記述するのは面倒ですが、VC++2010 ではdecltype
そのために使用できます。例えば:
HMODULE user32 = LoadLibraryW(L"user32");
if (user32 != NULL)
{
auto messageBoxW = reinterpret_cast<decltype(MessageBoxW)*>(GetProcAddress(user32, "MessageBoxW"));
if (messageBoxW != NULL)
{
messageBoxW(HWND_DESKTOP, L"Hello!", NULL, MB_OK);
}
}
ただし、多くのシェル API は、COM コンポーネントとインターフェイスを介して公開されています。それらのケースは異なります。まったく新しいコンポーネントを扱う必要がある場合があります。egIApplicationDestinations
は Win7 の新しいインターフェイスであり、それを実装するコクラスも新しいものです。そのような場合は、 を実行しCoCreateInstance
て戻り値を確認するだけで済みます。REGDB_E_CLASSNOTREG
これは、そのようなコクラスがシステムに登録されていないことを意味します (事実上、サポートされていません)。
ただし、新しい OS バージョンでは、既存のコクラスに新しいインターフェイスが導入されることがあります。例としては、Win7 で新しく導入されたものですが、Win95 を実装してさかのぼるITaskbarList3
既存のコクラスで提供されています。ITaskbarList
そのような場合は、最初に最も基本的なインターフェイスのコクラスをインスタンス化し、次に を使用QueryInterface
して新しいインターフェイス バージョンを取得し、 の戻り値をチェックしてサポートされていないことを検出する必要がありますE_NOINTERFACE
。