如何告诉Delphi在DXS中使用本地项目的Security.pas文件而不是Winapi.Security.pas?

时间:2015-09-23 21:56:41

标签: delphi delphi-10-seattle dcc32

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

我已经尝试重命名项目Security.pas,但这会导致更多问题,编译器会产生与它所抱怨的代码无关的错误,所以这是一个很好的选择。现在不要下来。这个项目在XE7,FWIW中建立得很好,所以这不是由于项目中的任何代码更改。

更新

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

4 个答案:

答案 0 :(得分: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 Package' 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单位,我期望这些单位很重要。

答案 1 :(得分:0)

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

  

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

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

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

答案 2 :(得分:-1)

我可能错了,但我相信如果Security.pas文件的使用子句中有dpr及其完整路径,那么它将优先于通过任何文件找到的文件名称空间和搜索路径。

答案 3 :(得分:-2)

打开项目设置,在Delphi Compiler部分中从“Unit scope names”中删除“Winapi”。

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