GetStagedPackageOrigin 未在 Kernel32.dll 中找到,但在 Kernelbase.dll 中找到
GetStagedPackageOrigin is not found in Kernel32.dll as documented, but in Kernelbase.dll instead
我正在尝试使用 LoadLibrary 和 GetProcAddress 动态加载 GetStagedPackageOrigin
WinAPI,这样我的应用程序也可以 运行 在 Windows 7 上。所以 according to documentation API 应该是从 Kernel32.dll 导入的,但实际上(在我的 Windows 10 v1709 中)它不是。
我在 Kernelbase.dll 中找到了它:
所以我想知道,我可以从 Kernelbase.dll 动态加载它吗?
这绝对是文档中的错误。如果我们调用(在 win10 上测试)
GetProcAddress(GetModuleHandle(L"kernel32"), "GetStagedPackageOrigin");
我们得到 0 - 这意味着这个 api 没有从 kernel32.dll
导出或转发
但如果调用
GetProcAddress(GetModuleHandle(L"kernelbase"), "GetStagedPackageOrigin");
我们得到了它的真实地址。
下一步 - 当我搜索最新的 sdk 库时 - 我也没有在 kernel32.lib
中找到 GetStagedPackageOrigin
。只有一个包含此符号的库 - OneCoreUap.lib
umbrella library - and marked it exported from api-ms-win-appmodel-runtime-l1-1-1.dll
.this dll 在运行时解析为 kernel.appcore.dll
。实施 - 只需跳转到 kernelbase.GetStagedPackageOrigin
我认为最正确的尝试从 api-ms-win-appmodel-runtime-l1-1-1.dll
导入这个 api
对我的外表的评价很奇怪 :) 问题很简单
任何人都可以在 win8.1、win10
上轻松测试这个简单的代码
GetProcAddress(LoadLibrary(L"kernel32"), "GetStagedPackageOrigin");//fail
GetProcAddress(LoadLibrary(L"kernelbase"), "GetStagedPackageOrigin");//ok
GetProcAddress(LoadLibrary(L"kernel.appcore.dll"), "GetStagedPackageOrigin");//ok
GetProcAddress(LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1"), "GetStagedPackageOrigin");//ok
并认为事实上 GetStagedPackageOrigin
而不是 exported from kernel32.dll
。这就是事实。
关于 lib 文件 - 我手头没有 win8.1 sdk,但我通过 lib 文件在 10.x sdk 版本中搜索这个 api - 我发现这个 api仅在 OneCoreUap.lib
中实现(在 kernel32.lib 中没有此符号)。 OneCoreUap.lib
表示 api 由 api-ms-win-appmodel-runtime-l1-1-1.dll
导出。因此,如果我们 link 使用此库 - 事实上,我们将尝试使用 api-ms-win-appmodel-runtime-l1-1-1.dll
导入此 api (此名称将硬编码在我们的 pe 文件中)。所以我们需要 or link with OneCoreUap.lib
(我建议将其添加到 lib 列表的末尾)或直接调用 GetProcAddress(LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1"), "GetStagedPackageOrigin");
.
并且可以注意到使用了哪些头文件 - 与问题完全无关。如果有人不同意这一点 - 我可以问 - 需要使用哪个库 - 请 concrete 回答。从哪个 dll - 请 concrete dll 名称应用程序将在使用此库时使用(此 dll 名称将在 pe import table 中硬编码)
我当然不会将它绑定到版本化的 api-ms-win-appmodel-runtime-l1-1-1.dll ,而是绑定到两个通用的。内核库或 kernel.appcore。
版本是可视的 studio/ucrt 版本特定。
我正在尝试使用 LoadLibrary 和 GetProcAddress 动态加载 GetStagedPackageOrigin
WinAPI,这样我的应用程序也可以 运行 在 Windows 7 上。所以 according to documentation API 应该是从 Kernel32.dll 导入的,但实际上(在我的 Windows 10 v1709 中)它不是。
我在 Kernelbase.dll 中找到了它:
所以我想知道,我可以从 Kernelbase.dll 动态加载它吗?
这绝对是文档中的错误。如果我们调用(在 win10 上测试)
GetProcAddress(GetModuleHandle(L"kernel32"), "GetStagedPackageOrigin");
我们得到 0 - 这意味着这个 api 没有从 kernel32.dll
但如果调用
GetProcAddress(GetModuleHandle(L"kernelbase"), "GetStagedPackageOrigin");
我们得到了它的真实地址。
下一步 - 当我搜索最新的 sdk 库时 - 我也没有在 kernel32.lib
中找到 GetStagedPackageOrigin
。只有一个包含此符号的库 - OneCoreUap.lib
umbrella library - and marked it exported from api-ms-win-appmodel-runtime-l1-1-1.dll
.this dll 在运行时解析为 kernel.appcore.dll
。实施 - 只需跳转到 kernelbase.GetStagedPackageOrigin
我认为最正确的尝试从 api-ms-win-appmodel-runtime-l1-1-1.dll
对我的外表的评价很奇怪 :) 问题很简单 任何人都可以在 win8.1、win10
上轻松测试这个简单的代码GetProcAddress(LoadLibrary(L"kernel32"), "GetStagedPackageOrigin");//fail
GetProcAddress(LoadLibrary(L"kernelbase"), "GetStagedPackageOrigin");//ok
GetProcAddress(LoadLibrary(L"kernel.appcore.dll"), "GetStagedPackageOrigin");//ok
GetProcAddress(LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1"), "GetStagedPackageOrigin");//ok
并认为事实上 GetStagedPackageOrigin
而不是 exported from kernel32.dll
。这就是事实。
关于 lib 文件 - 我手头没有 win8.1 sdk,但我通过 lib 文件在 10.x sdk 版本中搜索这个 api - 我发现这个 api仅在 OneCoreUap.lib
中实现(在 kernel32.lib 中没有此符号)。 OneCoreUap.lib
表示 api 由 api-ms-win-appmodel-runtime-l1-1-1.dll
导出。因此,如果我们 link 使用此库 - 事实上,我们将尝试使用 api-ms-win-appmodel-runtime-l1-1-1.dll
导入此 api (此名称将硬编码在我们的 pe 文件中)。所以我们需要 or link with OneCoreUap.lib
(我建议将其添加到 lib 列表的末尾)或直接调用 GetProcAddress(LoadLibrary(L"api-ms-win-appmodel-runtime-l1-1-1"), "GetStagedPackageOrigin");
.
并且可以注意到使用了哪些头文件 - 与问题完全无关。如果有人不同意这一点 - 我可以问 - 需要使用哪个库 - 请 concrete 回答。从哪个 dll - 请 concrete dll 名称应用程序将在使用此库时使用(此 dll 名称将在 pe import table 中硬编码)
我当然不会将它绑定到版本化的 api-ms-win-appmodel-runtime-l1-1-1.dll ,而是绑定到两个通用的。内核库或 kernel.appcore。 版本是可视的 studio/ucrt 版本特定。