1

Delphi 10 Seattle 引入了 Winapi.Security.pas。我正在尝试升级的项目(一个包)已经有一个 Security.pas 文件。没有从项目的范围名称列表中删除 Winapi(巨大的不良连锁反应),有没有办法告诉 IDE 和编译器使用项目的 Security.pas 文件而不是 Winapi.Security.pas?

我已经尝试将项目重命名为 Security.pas,但这会导致编译器产生更多问题,生成与它所抱怨的代码无关的错误,所以这是一个我现在不想继续下去的老鼠洞。这个项目在 XE7,FWIW 中构建得很好,所以这不是由于项目中的任何代码更改。

更新:

  • 重命名文件并使用单位别名不起作用。
  • 包的编译器行为与应用程序不同。
4

4 回答 4

5

看起来这实际上可能与Winapi.Security单位有关,而不是像您在问题中建议的那样通用。例如,以下包编译得很好:

package Package1;

requires
  rtl;

contains
  Windows in 'Windows.pas'; // blank unit named Windows.pas in project folder

end.

请注意,我和您一样,已包含Winapi在项目的单位范围名称列表中。

另一方面,这个包不编译:

package Package1;

requires
  rtl;

contains
  Security in 'Security.pas'; // blank unit named Security.pas in project folder

end.

编译器失败并显示:

[dcc32 错误] Package1.dpk(7): E2200 包 'rtl' 已经包含单元 'Winapi.Security'

如果问题纯粹与单元范围名称有关,那么两个包都可以编译,或者都失败。因此,我的结论是Winapi.Security.

我找不到Winapi.Security. 我想知道它实际上是什么。[Nicholas Ring 在rtl\win\winrt目录中为我找到了源代码。]

无论如何,我认为是时候提交一份 QP 报告了。下面无法编译的包可能是该 QP 报告的起点。[您提交的报告在这里是RSP-12469。]

我似乎很清楚,如果你想收养西雅图,你必须在短期内重新命名你的单位。

FWIW,这里有一些其他单位的行为方式与Winapi.Security

  • Winapi.ApplicationModel
  • Winapi.CommonTypes
  • Winapi.Devices
  • Winapi.Foundation
  • Winapi.Gaming
  • Winapi.Globalization
  • Winapi.GraphicsRT
  • Winapi.Management
  • Winapi.Media
  • Winapi.Networking
  • Winapi.Storage
  • Winapi.UI
  • Winapi.WebRT

这些都是我认为很重要的新添加的 WinRT 单元。

于 2015-09-29T06:12:45.357 回答
0

如果您将 Winapi.Security 和您的本地 Security 放在同一个 uses 子句中,那么您可以毫无问题地访问它们的成员。如果将它们放在单独的使用子句中(接口与实现),那么您将收到错误消息:

E2004 标识符重新声明:'Winapi.Security'

如果我只在 uses 子句中包含 Security.pas(并且它包含在项目中),那么它就可以很好地访问其成员。

也许我需要更多关于您遇到什么错误的信息?我将向您发送一个示例项目,以显示此工作。

于 2015-09-25T18:51:51.413 回答
-1

我可能错了,但我相信如果Security.pasdpr文件的使用子句中,连同其完整路径,它将优先于可以通过命名空间和搜索路径找到的任何文件。

于 2015-09-29T07:09:01.820 回答
-2

打开项目设置,在 Delphi 编译器部分从“单元范围名称”中删除“Winapi”。

这样,当您需要 Delphi 附带的 Security 单元时,您必须编写 Winapi.Security,如果您编写 Security,它将使用您自定义的 Security 单元。

于 2015-09-28T18:14:04.077 回答