我正在尝试有条件使用(如果可用(函数 PathCchAppend
。我从标题pathcch.h
获得了功能签名。但是,当我尝试从SHLWAPI.DLL
获取功能地址时,它会失败:
auto pca = GetProcAddress(GetModuleHandle(L"shlwapi.dll"), "PathCchAppend");
使用依赖关系,我看到此功能在此DLL中不存在(我在Windows 10(。没有任何pathcch.dll
,因此也无法加载。
在哪个dll放置此功能?
编辑:感谢答案。在这里,我找到了以下答案中提到的DLL的名称:
https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-81-api-sets
您可以使用dumpbin工具从.lib文件中提取此信息:
dumpbin /headers /path/to/pathcch.lib
然后,您需要筛选输出才能找到所讨论的功能。例如,这是LIB文件的X64版本的输出:
版本:0 机器:8664(x64( timedatestamp:ffffffff太阳2月7日06:28:15 2106 sizeofdata:0000002E DLL名称:API-MS-WIN-CORE-PATH-L1-1-0.DLL 符号名称:Pathcchappend 类型:代码 名称类型:名称 提示:5 名称:Pathcchappend
关于硬编码此dll名称的向后和转发兼容性的注释,.lib文件硬码DLL名称。因此,如果您使用.lib文件链接到该函数,那么您将硬编码为DLL。这将Microsoft绑定到合同中,以继续在Windows版本中从该DLL导出此功能。因此,使用LoadLibrary/GetProcAddress
明确链接的链接与使用SDK中的.lib文件的链接相比,明确链接不可能或多或少是安全的。
api-ms-win-core-path-l1-1-0.dll
不是磁盘上的实际dll,也不是文件,而是一些虚拟名称,因此加载程序能够在末尾映射到文件上的某些磁盘。扩展DLL仅由会议或仅由加载程序作为系统要求,但也不意味着任何文件。
您可以在加载程序操作的上下文中使用API集名称,例如LoadLibrary或P/Indoke而不是DLL模块名称,以确保到达实现的正确路由,无论当前设备上实际实现了API。但是,当您执行此操作时,必须在合同名称末尾附加字符串.dll。这是加载程序正常运行的要求,实际上并不是合同名称的一部分。尽管合同名称在此上下文中与DLL名称相似,但它们与DLL模块名称根本不同,并且不直接参考磁盘上的文件。
https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-apisets-pisets#api-set-connarts-names
因此,问题的真正答案是KernelBase.dll
。这对于像我这样的用例很重要,我需要根据实际DLL创建一个LIB文件,只有KernelBase.dll
才有可能。MS维护一些其他文档,也可以提供一些API集的基础文件。