如何将 PathCchCanonicalizeEx 与 C++Builder 10.2 一起使用?

2024-01-03

我有一个使用旧版 32 位 C++ 编译器的旧版 Windows 项目。由于各种原因我需要使用Windows 8+功能PathCchCanonicalizeEx https://stackoverflow.com/questions/71038645/how-do-i-need-to-integrate-windows-sdks-into-existing-project-in-cbuilder-10-2。 C++Builder 似乎为此提供了标头和一些模块定义文件,但我找不到任何可链接的库:

[ilink32 Error] Error: Unresolved external 'PathCchCanonicalizeEx' referenced from C:\[...]\WIN32\DEBUG\TMP\FILE.OBJ

我该如何解决这个问题?我需要添加一个Windows 8.1 SDK https://stackoverflow.com/questions/71038645/how-do-i-need-to-integrate-windows-sdks-into-existing-project-in-cbuilder-10-2?必要的库是否只是名称不同而我找不到它?完全不同的东西吗?


根据我的测试,有两种选择:

我正在开发/测试一些 Windows 10 21H2,它提供了一个实现PathCchCanonicalizeEx已经在某些 DLL 中了。因此,如果源 DLL 已知,则可以使用IMPLIB or MKEXP手动创建导入库。我这样做了,然后添加了创建的库IMPLIB对于我的项目,链接器错误立即消失了。

不过,要知道在哪里并不容易PathCchCanonicalizeEx 被放置在 https://stackoverflow.com/questions/57354840/which-dll-has-pathcchappend。人们很容易找到api-ms-win-core-path-l1-1-0.dll,但那个东西不是磁盘上的实际文件,因此不能被使用IMPLIB or MKEXP。该名称只是库加载器的虚拟概念,用于处理现代 Windows 的相同命名的 API 集,即扩展.dll并不意味着它根本就是一个文件。

您可以在加载器操作(例如 LoadLibrary 或 P/Invoke)的上下文中使用 API 集名称,而不是 DLL 模块名称,以确保实现正确的路由,无论 API 在当前设备上的何处实际实现。但是,执行此操作时,必须在合约名称末尾附加字符串 .dll。这是加载程序正常运行的要求,实际上并不被视为合约名称的一部分。尽管合约名称在这种情况下看起来与 DLL 名称类似,但它们与 DLL 模块名称有本质上的不同,并且不直接引用磁盘上的文件。

https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-apisets#api-set-contract-names https://learn.microsoft.com/en-us/windows/win32/apiindex/windows-apisets#api-set-contract-names

你真正需要做的是KernelBase.dll,这是偶数由 MS 记录 https://github.com/MicrosoftDocs/sdk-api/blob/docs/sdk-api-src/content/pathcch/nf-pathcch-pathcchappend.md.

implib "KernelBase x86.lib"    C:\Windows\SysWOW64\KernelBase.dll
implib "KernelBase x86-64.lib" C:\Windows\System32\KernelBase.dll
  1. 模块定义文件 https://docwiki.embarcadero.com/RADStudio/Sydney/en/Module_Definition_Files

手动创建 LIB 文件的缺点是需要在项目中维护这些文件。事情取决于目标是 32 位还是 64 位、调试还是发布,因此路径可能会变得有点复杂,可能需要使用目标的占位符和类似的东西在项目设置中为库创建相对路径。

看来这一切都可以避免模块定义文件 https://blogs.embarcadero.com/how-to-build-and-use-a-simple-dll/,其目的是提供 IMPORT 和 EXPORT 语句,以使用其他 DLL 导出的函数或使其他 DLL 可以使用自己的函数。我通过使用扩展名创建一个类似于我的应用程序的文件,成功解决了链接器问题.def与我的其他项目文件一起。不过,需要将该文件添加到项目中。

dbxml.cbproj
dbxml.cbproj.local
dbxml.cpp
dbxml.def
dbxml.res
[...]

以下内容使应用程序使用正确 DLL 中的正确函数。不过,使用 API 集名称不起作用,这会导致链接器出现错误消息。

IMPORTS
    KernelBase.PathCchCanonicalizeEx
IMPORTS
    api-ms-win-core-path-l1-1-0.PathCchCanonicalizeEx

[ilink32 错误]“ilink32”的命令行开关无效。参数“ItemSpec”不能为空。

[ilink32 错误] 致命:处理 .DEF 文件时出错

后者是在重新启动C++Builder之后,所以我猜由于API集名称的原因,文件的格式根本就是错误的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 PathCchCanonicalizeEx 与 C++Builder 10.2 一起使用? 的相关文章

  • 尼克劳斯·沃斯奖 (Niklaus Wirth Award) Pascal最具价值贡献者奖Marco Cantú获奖感言:关于Pascal和Delphi历史的个人观点

    这是一篇很长的博客文章 其中包含我在萨拉曼卡国际Pascal帕斯卡大会上发表的演讲 这是一部Pascal的历史 但是是从非常个人的角度来看的 在开始演讲之前 我要感谢国际Pascal大会的组织者 特别是塞尔吉奥 他们为举办这次活动付出了巨大
  • 在命令行上编译 C++Builder 项目

    有没有办法编译一个C Builder从命令行项目 特定的构建配置 就像是 CommandToBuild ProjectNameToBuild BuildConfiguration Use msbuild project cbproj p c
  • 更改复选框状态而不调用 OnClick 事件

    我想知道当我改变 CheckBox 的状态时 CheckBox gt Checked false 它调用了CheckBox OnClick事件 如何避免它 在较新的 Delphi 版本中 您可以使用类助手来添加此功能 CheckBox Se
  • 求VCL工具栏布局图设计

    我正在寻找 C 构建器的 VCL 组件 它最好有一个具有拖放功能的工具栏 我想定义一个建筑物或区域 可能不是矩形 并将其分成 房间 或区域 或任何你想称呼它们的东西 我希望能够将 门口 或通道等 从一个房间放入其邻居中 有这样的事吗 最好是
  • 仅初始化部分功能一次

    我有一个很小的函数 我想初始化一次 例如 void SomeFunc static bool DoInit true if DoInit CallSomeInitCode DoInit false The rest of the funct
  • 这个字符串的范围是多少?

    如果我有以下代码 UnicodeString sFish L FISH char szFish AnsiString sFish c str CallFunc szFish 那么临时的范围是什么呢 AnsiString已创建 持续时间是多久
  • 如何禁用XE6中的嵌入式设计器?

    为了在一个窗口中查看多个视图 我阅读了this回答但似乎这些选项不再可用 现在我的问题是如何配置 rad studio xe6 以查看多个视图 在窗口中 例如实际代码和设计形式 您链接到的问题中讨论的选项仍然适用于 XE6 关键是禁用嵌入式
  • 为什么 Borland 会在不同的 C 文件中使用同一对象的多个定义进行编译,而 GCC 却不会?

    我正在研究全局变量的行为 到目前为止 我认为全局变量的多重定义是一种非法的方式 并且必须得到一个错误 但是我从 Borland C C 编译器得到了意想不到的结果 而 GCC 给了我预期的结果 Code test1 c include
  • GetWindowRect 在 Windows 10 中具有偏移量

    我在程序中使用 GetWindowRect 来获取桌面上窗口的坐标 这在我用于测试的十几台电脑 XP W8 1 上运行良好 但在我的一台带触摸屏的 W10 电脑上则不然 坐标向左上角有偏移 我在 google 上搜索了 Windows 10
  • 将 unicode 转换为 char

    如何将 Unicode 字符串转换为char or char const in 内河码头 c String text Hello world char txt AnsiString text c str Older text t str i
  • 如何自动展开所有TreeView节点?

    我想在应用程序启动时展开主窗体上的树 我怎样才能做到呢 我找不到相应的属性 C 生成器 2009 您只需致电FullExpand http docwiki embarcadero com VCL en ComCtrls TCustomTre
  • C++ Builder 不会在断点处停止

    我有一个项目 新开始 其中 C Builder 不会在任何断点处停止 我已确保处于调试模式 不是发布 链接器 gt 完整调试信息 True C 编译器 gt 调试配置 C 编译器 gt 调试 gt 调试信息 true 调试行号信息 true
  • 是否有 FMX 函数可以在运行时设置 TImage 的透明颜色?

    我在 FMX FireMonkey 的表单上有一个 TImage 我想在运行时将位图加载到 TImage 中 其中位图应该具有由位图中第一个像素的颜色定义的透明背景 该颜色可能因位图而异 我知道如何在设计时通过使用 TImage 的 Mul
  • C++ 构建器中的线程[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我是 C 构建器的新手 不熟悉线程
  • C++ Builder xe5 检测到错误(LME288)

    c Builder xe5 ilink32 Error 错误 无法执行链接 ilink32 警告 警告 检测到错误 LME288 当我尝试编译一个测试项目时发生了这种情况 时间 2019 05 17 标签 c builderxe5windo
  • WebSocket 连接到 TIdHTTPServer,握手问题

    我正在使用 C Builder 10 1 Berlin 编写一个简单的 WebSocket 服务器应用程序 该应用程序在端口上侦听从 Web 浏览器 例如 Google Chrome 发送的一些命令 在我的表单上 我有一个 TMemo TB
  • OnNewText 事件后何时重绘 VirtualTreeView?

    我使用此代码来填充 VirtualStringTree 并允许重命名项目 Structure for the tree struct TVSTdata UnicodeString Name Initialization o
  • QT 中的应用程序->处理消息?

    在 Borland 6 中 我经常使用它来解除程序操作的卡住 Application gt Processmessages 现在 对于 QT 4 8 1 我在这个外国 对我来说 QT 文档中找不到 谁能帮我 在 Qt 中 您可以使用静态函数
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 在 Borland C++ Builder 6 中使用帧缓冲区对象 (FBO)

    我对帧缓冲区对象 FBO 的命令 glGenFramebuffersEXT 有 访问冲突 void TGLForm DrawScene wglMakeCurrent ghDC ghRC glEnable GL TEXTURE 2D GLui

随机推荐