gpt4 book ai didi

c++ - 检查是否存在 Windows API 函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:20 25 4
gpt4 key购买 nike

我是 Windows 编程的新手,我正在尝试发现检查 Windows Shell API 函数是否存在的最佳方法。我想使用 Windows7 中的一些新任务栏功能。

https://msdn.microsoft.com/en-us/library/dd378460%28VS.85%29.aspx#custom_jump_lists

但我仍然希望我的程序可用于以前版本的 Windows。有没有一种简单的方法可以知道这些功能是否可以在最终用户系统中调用。我正在用 C++ 编程。

最佳答案

这取决于函数的种类。

对于普通(非 COM)函数,唯一的方法是使用 LoadLibraryGetProcAddress。如果任一失败,您就知道操作系统缺少该功能。为复制现有函数签名的函数指针编写那些函数指针类型声明可能很乏味,但在 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 组件和接口(interface)公开的。这些情况是不同的。有时您需要处理全新的组件;例如IApplicationDestinations是Win7中新的接口(interface),实现它的coclass也是新的。在这些情况下,您可以只执行 CoCreateInstance,并检查 REGDB_E_CLASSNOTREG 的返回值 - 这意味着此类 coclass 未在系统上注册(实际上,是'支持)。

然而,有时新的操作系统版本会在现有组件类上引入新接口(interface)。一个例子是 ITaskbarList3,它是 Win7 中的新功能,但在实现 ITaskbarList 并可追溯到 Win95 的现有组件类上提供。在这些情况下,您应该首先实例化最基本接口(interface)的 coclass,然后使用 QueryInterface 获取新的接口(interface)版本,并通过检查 E_NOINTERFACE 的返回值来检测它们是否不受支持

关于c++ - 检查是否存在 Windows API 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com