如何将 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 一起使用? 的相关文章

  • 使用C++中用OLEDB读dbf文件,报“外部表不是预期的格式”错误的处理

    使用C builder的ADO控件访问dbf文件 执行SQL时报错 我的connect连接字符串 con1 gt ConnectionString Provider Microsoft Jet OLEDB 4 0 Data Source s
  • C/C++程序员何去何从

    滚滚长江东逝水 浪花淘尽英雄 虽说是个人英雄的时代已经成为过去 但我们仍然不能对这样的榜样们有所忘怀 他们是WPS求伯君 CCDOS严援朝 2 13吴晓军 四通利方王志东 CCED朱崇君 UCDOS鲍岳桥等 因为他们不仅是成名的优秀程序员
  • 求VCL工具栏布局图设计

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

    我的开发系统 Codegear C Builder 的变幻莫测之一是一些自动生成的标头坚持具有 using namespace xyzzy 其中的语句 当我最不想要或期望它时 它们会影响我的代码 有没有办法可以以某种方式取消 覆盖以前的 使
  • 如何自动展开所有TreeView节点?

    我想在应用程序启动时展开主窗体上的树 我怎样才能做到呢 我找不到相应的属性 C 生成器 2009 您只需致电FullExpand http docwiki embarcadero com VCL en ComCtrls TCustomTre
  • 如何将 PathCchCanonicalizeEx 与 C++Builder 10.2 一起使用?

    我有一个使用旧版 32 位 C 编译器的旧版 Windows 项目 由于各种原因我需要使用Windows 8 功能PathCchCanonicalizeEx https stackoverflow com questions 7103864
  • C++ Builder:刷新 FireMonkey 可视组件

    我在使用 C Builder 和 FireMonkey 时遇到问题 我正在创建一个与 Datasnap Rest WebService 连接的移动应用程序 有些请求有点长 所以我想显示一条等待消息 这是我的代码 lbl testConnex
  • Delphi - 窗体中的窗体

    出于美观原因 我想在另一个表单之上显示一个表单 就像它是一个组件一样 比如 TPanel 它应该随父级一起调整大小 当父级被标题栏拖动时四处移动 等等 main form component 1 main the embedded form
  • 是什么导致桌面屏蔽图标覆盖在*某些*桌面上

    我有一个 C Builder Delphi 应用程序 它具有作为资源嵌入的以下清单
  • 将 Vcl::Controls::TCaption 又名 (System::UnicodeString) 转换为 const char *

    我目前正在使用 C Builder 创建一个将文本复制到用户剪贴板的应用程序 我已经放置了一个TMemo控制 我想将其包含在const char 变量如下面的代码所示 const char output TMemo1 gt Text 当我编
  • `Class of` 类型声明的含义是什么?

    在查看我的代码之一时 我陷入了如下的一项声明 TMyObjectClass class of TMyObject 我有点困惑 想知道这句话的含义是什么 作为TMyObjectClass声明之上没有任何声明 and TMyObject声明如下
  • 如何创建像 Delphi 应用程序一样的独立(没有 DLL 文件依赖项)C++Builder 控制台应用程序?

    当我创建 Delphi 控制台应用程序时 我可以部署生成的 EXE 文件 而不必担心外部 DLL 文件 但如果我创建非常简单C Builder http en wikipedia org wiki C Builder 2007 版 控制台应
  • FindNextFile 在 64 位 Windows 上失败?

    使用 C Builder 2007 FindFirstFile 和 FindNextFile 函数似乎无法在 64 位版本的 Vista 和 XP 上找到某些文件 我的测试应用程序是 32 位的 如果我使用它们遍历文件夹 C Windows
  • 使用 TEmbeddedWB 或 TWebBrowser 检测外部内容

    我试图阻止由 TEmbeddedWB 或 TWebBrowser 或 TCppWebBrowser 加载的任何外部内容 我想阻止从互联网加载的任何内容 包括图像 javascript 外部 CSS 外部 embed 或 object 或 a
  • 如何将 FastMM 添加到 C++ Builder 项目?

    我正在尝试配置FASTMM4 for Builder C 6我遵循的步骤是 下载的 zip 文件来自来源锻造 http sourceforge net projects fastmm 在下面Project gt Options gt Lin
  • OnNewText 事件后何时重绘 VirtualTreeView?

    我使用此代码来填充 VirtualStringTree 并允许重命名项目 Structure for the tree struct TVSTdata UnicodeString Name Initialization o
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 使用 C++ builder 读取 gmail pop3

    我想使用 c builder 阅读我的 Gmail 收件箱电子邮件 因此我使用从 youtube 上的视频中获取的代码 但在阅读之前 我尝试首先使用按钮中的代码进行连接 MyPoP3 POP3 gt Host pop gmail com P

随机推荐