Winapi GetStagedPackageOrigin未在Kernel32.dll中找到,而是在Kernelbase.dll中找到

Winapi GetStagedPackageOrigin未在Kernel32.dll中找到,而是在Kernelbase.dll中找到,winapi,dynamic-loading,Winapi,Dynamic Loading,我正在尝试使用LoadLibrary和GetProcAddress动态加载GetStagedPackageGeorginWinAPI,这样我的应用程序也可以在Windows 7上运行。所以API应该从Kernel32.dll导入,但实际上(在我的Windows10V1709中)不是这样 我可以在Kernelbase.dll中找到它: 所以我想知道,我可以从Kernelbase.dll动态加载它吗?这肯定是文档中的错误。如果我们调用(在win10上测试) GetProcAddress(GetMo

我正在尝试使用LoadLibrary和GetProcAddress动态加载
GetStagedPackageGeorgin
WinAPI,这样我的应用程序也可以在Windows 7上运行。所以API应该从Kernel32.dll导入,但实际上(在我的Windows10V1709中)不是这样

我可以在Kernelbase.dll中找到它:


所以我想知道,我可以从Kernelbase.dll动态加载它吗?

这肯定是文档中的错误。如果我们调用(在win10上测试)

GetProcAddress(GetModuleHandle(L“kernel32”),“getStagedPackageGeorgin”)

我们得到0-这意味着此api未从
kernel32.dll导出或转发

但是如果你打电话

GetProcAddress(GetModuleHandle(L“kernelbase”),“getStagedPackageGeorgin”)

我们找到了它的真实地址

下一步-当我在最新的sdk库中搜索时-我也没有在
kernel32.lib
中找到
getStagedPackageGeorgin
。只有一个库包含此符号-伞形库-并将其标记为导出自。此dll在运行时解析为
kernel.appcore.dll
。实现-只需跳转到
kernelbase.getStagedPackageGeorgin

因此,我认为最正确的方法是尝试从
api-ms-win-appmodel-runtime-l1-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
并查看从kernel32.dll导出的事实
GetStagedPackageOrigin
not
。这只是事实

关于lib文件-我手头没有win8.1 sdk,但我通过lib文件在10.x sdk版本中搜索此api-我发现此api仅在
OneCoreUap.lib
中实现(而不是在kernel32.lib中的此符号)。和
OneCoreUap.lib
表示此api ix由
api-ms-win-appmodel-runtime-l1-1.dll
导出。因此,如果我们链接到这个库,事实上我们将尝试使用
api-ms-win-appmodel-runtime-l1-1.dll导入这个api(这个名称将在我们的pe文件中硬编码)。因此,我们需要或链接到
OneCoreUap.lib
(我建议将其添加到lib列表的末尾)或直接调用
GetProcAddress(LoadLibrary(L“api-ms-win-appmodel-runtime-l1-1-1”),“GetStagedPackageOrigin”)


并且可以注意到,哪些头文件使用-absolute和这个问题根本没有关系。如果有人不同意这一点-我可以问一下-哪个库需要使用-请具体回答。以及使用此库时将使用哪个dll-pleaseconcretedll名称应用程序(此dll名称将在pe导入表中硬编码)

您应该能够在
KERNEL32.dll
上使用
LoadLibrary
。有两个地方。你有没有犯错,或者你只是好奇?(另请参见)@Christian.K-它不是从kernel32.dll转发的。你为什么要调用
GetProcAddress
,而不是让系统为你做这些工作?如果需要支持Windows 8.1之前的Windows版本,请在运行时使用动态响应可用性。@IInspectable-以及
/DELAYLOAD:dllname
链接器选项使用哪个dll?哪一个lib文件?@IInspectable:有很多原因可以解释为什么不想使用延迟加载DLL。仅举几个例子:1)它比较慢&引入了不必要的开销,尤其是在代码中经常调用函数时。2) 它引入了不必要的复杂性,例如,当我不期望时,可能会引发一些异常(在延迟加载帮助函数中)3)延迟加载调用
LoadLibrary
当我知道模块已经加载时,我可能希望更快更安全
GetModuleHandle
4)我可能想知道API是否提前可用(以显示特定的用户界面。)我的空间用完了,但实际上这是一个错误的解决方案。正确的解决方案当然是使用SDK头和libs。@DavidFeffernan-这里怎么了?
OneCoreUap.lib
这是SDK-lib.headers-这里根本不相关。从您的视图中需要使用哪个lib文件?尝试从任何位置加载它肯定是错误的特定的DLL。当然,您只需要包含头文件,指向lib文件的链接,就这样。@DavidHeffernan-看起来您理解我错了。首先包括头文件-这里完全不相关。在heder文件(*appmodel.h()仅函数定义。此处未说明此函数的实现位置。关于lib文件-我和say-需要使用OneCoreUap.lib-这是唯一一个在SDK中最新版本(自10.0.10240.0版本)中声明此api的lib文件。如果您不同意-我可以问一下使用哪个库文件吗?在OneCoreUap.lib中,clear声明从api-ms-win-appmodel-runtime-l1-1-1.dllso导出的此api一旦我的应用程序与此库链接,它实际上在运行时将使用此dll。因此,如果ms remove
api-ms-win-appmodel-runtime-l1-1-1.dll
或此dll中的此api已生成使用OneCoreUap.lib的lt应用程序-停止工作.so和直接调用
GetProcAddress(LoadLibrary(L“api-ms-win-appmodel-runtime-l1-1-1”),“GetStagedPackageOrigin”);
不会出错