我是
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); } }
但是,许多Shell API都是通过COM组件和接口公开的.那些情况不同.有时你需要处理全新的组件;例如IApplicationDestinations是Win7中的一个新接口,实现它的coclass也是新的.在这些情况下,您可以只执行CoCreateInstance,并检查REGDB_E_CLASSNOTREG的返回值 – 这意味着此类coclass未在系统上注册(并且实际上不受支持).
但是,有时新的操作系统版本会在现有的coclass上引入新的接口.一个例子是ITaskbarList3,Win7中的新增功能,但是在现有的coclass上提供,它实现了ITaskbarList并且可以追溯到Win95.在这些情况下,您应该首先为最基本的接口实例化coclass,然后使用QueryInterface获取新的接口版本,并通过检查E_NOINTERFACE的返回值来检测它们是否不受支持.