我是Windows编程的新手,我正在尝试发现检查Windows Shell API函数是否存在的最佳方法.我想在Windows7中使用一些新的任务栏功能.
https://msdn.microsoft.com/en-us/library/dd378460%28VS.85%29.aspx#custom_jump_lists
但我仍然希望我的程序可以被以前版本的Windows使用.有没有一种简单的方法可以知道这些函数是否可以在最终用户系统中调用.我正在用C++编程.
这取决于功能的种类.
对于普通(非COM)功能,唯一的方法是使用LoadLibrary和GetProcAddress.如果任何一个失败,您知道操作系统缺少该功能.为复制现有函数签名的函数指针编写那些函数指针类型声明可能很乏味,但在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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,许多Shell API都是通过COM组件和接口公开的.那些情况不同.有时你需要处理全新的组件; 例如IApplicationDestinations,Win7中的新界面,实现它的coclass也是新的.在这些情况下,您可以这样做CoCreateInstance,并检查返回值REGDB_E_CLASSNOTREG- 这意味着此类coclass未在系统上注册(实际上,并且不受支持).
但是,有时新的操作系统版本会在现有的coclass上引入新的接口.一个例子是ITaskbarList3Win7中的新增功能,但在现有的coclass上提供,它实现ITaskbarList并追溯到Win95.在这些情况下,您应该首先为最基本的接口实例化coclass,然后使用QueryInterface获取新的接口版本,并通过检查返回值来检测它们是否不受支持E_NOINTERFACE.