有没有一个工具可以检测重复的接口 GUID?

2024-04-02

这是一个典型的复制粘贴错误:

如果复制粘贴某些包含带有 GUID 的接口声明的 Delphi 代码,Delphi 将不会抱怨并编译在不同位置重复使用相同 GUID 的代码。

“支持”功能基于 GUID 与接口配合使用,因此可能会出现错误。

是否有可用的“质量保证”工具(可能是 Peganza 或 Delphi Sonar 插件)可以检测它们?


仅适用于最新版本的 Delphi。您可以使用以下代码在运行时检测这一点:

unit uInterfaces.Duplicates;

interface

uses
  System.Rtti,
  Spring,
  Spring.Collections;

type
  /// <summary>
  ///   Class allows to list the interfaces which are not implemented by any class in your module.
  /// </summary>
  InterfacesWithDuplicateGUID = class
  private class var
    /// <summary>
    ///   Reference to the RTTI context.
    /// </summary>
    FCtx: TRttiContext;
  public
    /// <summary>
    ///   Function returns the list of interfaces with duplicate GUID.
    /// </summary>
    /// <param name="AFilter">
    ///   A filter predicate for types to process.
    /// </param>
    class function Map(AFilter: TPredicate<TRttiInterfaceType> = nil): IMultiMap<TGUID, TRttiInterfaceType>;

    class constructor Create;
    class destructor Destroy;
  end;

implementation

uses
  System.TypInfo;

{ InterfacesNotImplemented }

class constructor InterfacesWithDuplicateGUID.Create;
begin
  FCtx := TRttiContext.Create;
end;

class destructor InterfacesWithDuplicateGUID.Destroy;
begin
  FCtx.Free;
end;

class function InterfacesWithDuplicateGUID.Map(AFilter: TPredicate<TRttiInterfaceType> = nil): IMultiMap<TGUID, TRttiInterfaceType>;
var
  LType: TRttiType;
  LIntf: TRttiInterfaceType;
  LTypes: IList<TRttiInterfaceType>;
begin
  { Create the result instance }
  Result := TCollections.CreateMultiMap<TGUID, TRttiInterfaceType>;

  { Get all the types }
  LTypes := TCollections.CreateList<TRttiInterfaceType>;

  { Build the multimap }
  for LType in FCtx.GetTypes do
    { Add only classes and interfaces }
    if LType.TypeKind = tkInterface then
      { Skip interfaces which does not have GUID }
      if TRttiInterfaceType(LType).GUID <> TGUID.Empty then
        begin
          { Handle user filter }
          if Assigned(AFilter) then
            if not AFilter(TRttiInterfaceType(LType)) then
              Continue;

          LTypes.Add(TRttiInterfaceType(LType));
        end;

  { For all interaces }
  for LIntf in LTypes do
    if LTypes.Any(
      function (const AType: TRttiInterfaceType): Boolean
      begin
        Result := (AType.GUID = LIntf.GUID) and (LIntf.QualifiedName <> AType.QualifiedName);
      end) then
      Result.Add(LIntf.GUID, LIntf);
end;

end.

当然如果它符合你的需求的话。因为将其包含到生产代码中并不是最好的主意。不过可以包含在测试代码中。

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

有没有一个工具可以检测重复的接口 GUID? 的相关文章

  • 如何将字符串解析为 UNIQUEIDENTIFIER?

    我正在编写一个实体框架 LINQ 查询 其中我想将字符串解析为 UNIQUEIDENTIFIER 又名 GUID 作为WHERE clause public IEnumerable
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • 如何在按键时识别 unicode 键?

    我的应用程序使用 unicode 字符 并且我有几个文本字段 我想限制用户输入特殊字符 例如 begin if not Key in a z A Z 0 9 13 8 then Key 0 if Key 13 then bOk Click
  • 似乎有时 Delphi 是区分大小写的 - “覆盖方法应该与祖先的大小写匹配”

    今天我遇到了一个 奇怪 的提示 覆盖方法 xxxx 应匹配祖先 yyyy 的大小写 解决方案是完全按照祖先中的方式声明方法名称 我相信这是自 Delphi Net 编译器以来编译器中保留的东西 与祖先中完全相同的方法声明方法使编译器 沉默
  • TXMLDocument.Active := False 导致 FastMM4 错误消息“FastMM 检测到块在释放后已被修改”

    我们在 FullDebugMode 下使用 Delphi XE8 和 FastMM4 版本 4 992 会产生奇怪的效果 要重现效果 只需创建一个新的 TForm 应用程序 将 FastMM4 放入 DPR 文件的第一行 在表单上放置一个按
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • 为什么 TImage 旋转我的图像?

    编写一个移动应用程序 它从安全网站提取图像 如下所示 第一个图像 提取不正确 注意网络版本与移动版本 第二个图像在网站上正确显示 但 Delphi TImage 由于某种原因正在旋转它我不明白为什么 旋转设置为 0 并且在 TImage 组
  • 有用的 Delphi 代码模板

    我用 Delphi 编程已经两年多了 我大概只有 5 个自定义模板 我觉得我应该有更多 如果有人有任何特别有用的东西 那么在 stackoverflow 上有一个很好的存储库就太好了 我不在乎您使用的是 Delphi 2009 语法还是 D
  • SQL Server 2008 GUID 列全为 0

    我希望这是我做的一个简单的傻事 我的数据库中有一个表 设置如下 column name widget guid data type uniqueidentifier allow nulls false default value newid
  • 如何修复这个 delphi 7 编译错误 - “重复资源”

    我正在尝试编译我继承的 Delphi 7 项目 但收到此错误 错误 警告 重复资源 错误 类型 2 位图 ID 编辑 错误 文件 C 路径缩短 common CRGrid res 资源已保留 文件 c common raptree RES
  • 将字符串作为 PChar 从 CSharp 传递到 Delphi DLL

    我正在尝试将字符串从 C 传递到 Delphi 构建的 DLL Delphi DLL 需要 PChar 这是Delphi导出 procedure DLL Message Location PChar AIntValue integer st
  • 使用远程数据编写 Android、iPad、iPhone 客户端的技术

    我需要探索世界 你写了一个杀手级应用程序 但你有 Android iPhone iPad 客户端吗 我的问题是 1 向这些设备发送数据的最佳方式是什么 按照建议进行肥皂和休息here https stackoverflow com ques
  • 德尔福和Doxygen

    我想使用 doxygen pas2dox 记录我的源代码 当我设置好所有内容 包括过滤器和提取选项 提取所有内容 时 doxygen 运行良好 但生成的文档仅包含源文件作为链接 并且没有提取类型 方法 过滤后的源看起来不错 有任何提示如何定
  • Android中如何检测程序的终止?

    当 Windows 程序终止时 它会调用事件处理程序 例如 OnClose OnDestroy 和析构函数 Destroy 当我想保存一些 INI 设置时 这些地方就是我要保存的地方 我为所有这些事件编写了事件处理程序 但当我终止程序时它们

随机推荐

  • 客户端语言

    我不是网络程序员 所以请原谅我的无知 当谈到服务器端编程时 我们有很多可用的技术 例如 PHP ASP net JSP 等 然而 说到客户端脚本 我只听说过 JavaScript 和 AJAX 也许您还可以包含 Java Applet 因为
  • 使用 PHP 将文件夹重命名为子文件夹

    我正在尝试通过重命名来移动文件夹 test1 和 test2 文件夹均已存在 rename test1 test2 xxx1 xxx2 我得到的错误是 重命名 没有这样的文件或目录 我认为这是因为目录 xxx1 不存在 我怎样才能移动 te
  • 大多数编译器都会优化 MATMUL(TRANSPOSE(A),B) 吗?

    In a Fortran program I need to compute several expressions like M v MT v MT M M MT etc Here M and v are 2D and 1D arrays
  • Scala:==默认等于吗?

    我正在阅读 Scala 编程 它说 您可以重新定义的行为 通过覆盖新类型equals方法 始终从类继承Any 继承的equals除非被覆盖 否则它是对象标识 就像 Java 中的情况一样 所以equals 随之而来的是 默认情况下与eq 但
  • 发布有关 Ektron 问题的最佳在线网站是什么?

    我正在尝试使用 Dotnet 在 Ektron 中做一个新项目 我发现数量相当少 stackoverflow 中发布的问题及其答复 最好的网站是什么 消除我在使用 Ektron 进行开发时的疑虑 谢谢 同意 zkent 但有额外的建议 发布
  • 尝试使用 Fluent NHibernate 调用存储过程时出现命名查询未知错误

    我正在为一个项目设置 NHibernate 并且有一些疑问 由于它们的复杂性 我们将保留为存储过程 我希望能够使用 NHibernate 来调用存储过程 但遇到了一个我无法弄清楚的错误 由于我使用的是 Fluent NHibernate 所
  • 使用WMI远程卸载应用程序

    我正在尝试编写一个迷你 w32 可执行文件来使用 WMI 远程卸载应用程序 我可以使用下面的代码列出所有已安装的应用程序 但我找不到通过 WMI 和 C 远程卸载应用程序的方法 我知道我可以使用 msiexec 作为进程来执行相同的操作 但
  • gradle 在哪里保存依赖项的 jar?

    我想查看添加依赖项时编译的 jars aars 例如 如果我在 Gradle 中添加此依赖项 它会将 jar 放在哪里 dependencies compile com google android gms play services an
  • 在knitr中跨行分割r块标题

    当我在 R 块标头中插入长标题等内容时 如果能够将标头拆分为多行 那就太好了 有什么简单的方法可以做到这一点吗 E g r echo FALSE warning FALSE fig cap Here is my really long ca
  • 关于“ls”,我如何只显示目录(链接目录和隐藏目录除外)

    我遇到一些关于 ls 这个命令的问题 我只想打印没有隐藏或链接的目录 但我用 man ls 查看解释 但没有找到 如果有一面旗帜表明我可以做我想做的事 thanks 下面是我要解决的问题 4 显示可见出口 This is two comma
  • 来自 Jenkins 的参考 Xcode 版本号

    我正在尝试在 Jenkins Build 中获取对 Xcode 项目 CFBundleVersionString 或 CFBundleVersion 的引用 我的目标是能够以这种方式设置内部版本号 CFBundleVersionString
  • Python 中 pickle 的常见用例

    我看过pickle http en wikipedia org wiki Pickle 28Python 29文档 但我不明白 pickle 在哪里有用 pickle 的一些常见用例有哪些 我遇到过的一些用途 1 将程序的状态数据保存到磁盘
  • 如何最大化和最小化div(没有jquery只有javascript)

    你好 我需要仅使用javascript而不是jquery来最大化或最小化我的html页面中的div 我希望能够这样做http jsfiddle net miqdad Qy6Sj 1 http jsfiddle net miqdad Qy6S
  • 如何在 winform 中托管带有 UI 的控制台 exe

    我正在开发一个具有某些特定要求的项目 我需要创建一个可以使用 C 监视并在其中运行 exe 的程序 然而 使用控制台程序来实际托管另一个exe的方法似乎没有尽头 所以我使用了WinForm 我一直在寻找并找到了一些非常好的解决方案 它在 W
  • 在PowerShell中获取PATH环境变量

    我想检查 PowerShell 中的 PATH 环境变量 我试过了 Get ChildItem env path 我想获得完整的路径 但只获得其中的很小一部分 我得到多少取决于 PowerShell 窗口的宽度 例如 C Program F
  • Google API 客户端机密错误 (Python)

    我想从 Google Analytics 检索数据 我已经在控制台中创建了一个服务帐户 并且我正在使用 Google 的 Python hello analytics api v3 py 代码来访问数据 我已经复制了client secre
  • Mac OS Cocoa:在画布上绘制一个简单的像素

    我希望我能找到这个问题的答案 我搜索了又搜索 找不到正确的答案 这是我的情况 在 Mac OS Cocoa 应用程序中 我想在应用程序窗口的专用区域上绘制一个像素 实际上是几个像素 我想 如果有一个就更好了NSImageView放置在那里
  • 对多列进行 GroupBy 并应用移动功能

    假设我有这个数据集 Country id Company id Date Company value 1 1 01 01 2018 1 1 1 02 01 2018 0 1 1 03 01 2018 2 1 1 04 01 2018 NA
  • 如何在jest和enzyme中设置useState Hook的初始状态?

    目前我正在使用带有反应钩子的功能组件 但我无法测试useState完全挂钩 考虑这样一个场景 useEffect钩子我正在执行 API 调用并在中设置值useState 对于笑话 酶 我模拟了要测试的数据 但我无法设置初始状态值useSta
  • 有没有一个工具可以检测重复的接口 GUID?

    这是一个典型的复制粘贴错误 如果复制粘贴某些包含带有 GUID 的接口声明的 Delphi 代码 Delphi 将不会抱怨并编译在不同位置重复使用相同 GUID 的代码 支持 功能基于 GUID 与接口配合使用 因此可能会出现错误 是否有可