Delphi 10 Seattle介绍了Winapi.Security.pas。我试图升级的项目(包)已经有一个Security.pas文件。如果没有从项目的范围名称列表中删除Winapi(巨大的不良的连锁反应),有没有办法告诉IDE和编译器使用项目的Security.pas文件代替Winapi.Security.pas?
我已经尝试重命名项目Security.pas,但这会导致更多问题,编译器会产生与它所抱怨的代码无关的错误,所以这是一个很好的选择。现在不要下来。这个项目在XE7,FWIW中建立得很好,所以这不是由于项目中的任何代码更改。
更新
答案 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,如果您编写安全性,它将使用您的自定义安全单元。