【问题标题】:Creating a new GUID or file ID From a path in delphi从 delphi 中的路径创建新的 GUID 或文件 ID
【发布时间】:2013-11-12 06:26:38
【问题描述】:

我正在使用 Delphi XE4 创建一个 Voip 程序。我正在使用一个过时的 VOIP SDK 来自一家名为 BigSpeed 的公司,该公司不再围绕当前代码点指向存储活动 x 控件的以下路径“C:\Program Files (x86)\BigSpeed Voice SDK\”。

    LIBID_bsVoiChatCln: TGUID = '{D2A88515-99E0-4EEE-A030-E5D2AB306A03}';
    IID_IbsVoiChatClnX: TGUID = '{5055A626-56A1-4E58-A461-000A69CA3E03}';
    DIID_IbsVoiChatClnXEvents: TGUID = '{665DB561-22D3-4624-B55B-4416309A2E03}';
    CLASS_bsVoiChatClnX: TGUID = '{BE761C1E-1F6C-46F8-A99B-0AB29C9B2D03}'; 

如何创建新的 GUID 并让程序从新目录访问活动的 x 控件。

【问题讨论】:

    标签: delphi sdk guid voip delphi-xe4


    【解决方案1】:

    您不想创建新的 GUID。 GUID 是该组件的标识符。据我从问题和您的 cmets 可以看出,您想要做的就是在不同的位置注册 DLL。

    几乎可以肯定,ActiveX DLL 使用自注册。这意味着您可以将 DLL 放在其他地方并在那里注册。例如,假设 DLL 位于:

    C:\MyFolder\MyDll.dll

    然后你可以通过执行这个命令来注册它:

    regsvr32 C:\MyFolder\MyDll.dll

    【讨论】:

      【解决方案2】:

      您似乎不理解(或不解释)您的程序、库和 GUID 之间的关系。

      如何创建新的 GUID 和

      1) GUID 只是一个 128 位的随机数。因此,您只需编辑其十六进制字符串即可“创建新的 GUID”。或者您可以在设计时在 Delphi 源代码编辑器中按 Ctrl+Shift+G。在运行时可以使用SysUtils单元的CreateGUID函数。

      但我认为创建新的 GUID 对您没有任何好处。如果有的话,它应该意味着明确声明与旧 GUID 不兼容(因此与 VOIP 库不兼容)

      从一个新目录。

      2) 为什么您认为您的 VoIP 库被安排为一组 ActiveX 控件?仅仅因为那里有 GUID?没有任何带有 GUID 的文本文件是 ActiveX。

      ActiveX 是专门安排的 Windows 服务器,它们在注册表中注册,以便任何程序都可以调用它们。有时,如果安装程序失败,您可以在事后注册它们。

      因此,无论它们是否构成 ActiveX,您都应该阅读您的库的手册,如果是,如何在 Windows 中注册它们(应该由库安装程序完成)

      如果安装程序没有提供它,那么您不能确定该库是否可以在不同的地方工作。不仅您的程序需要连接到它,而且库本身也可能需要连接到它的其他部分。

      让程序访问活动的 x 控件

      3) 如果您的库确实符合 ActiveX 规范并且正确安装(注册),那么您可以将它们导入 Delphi IDE 并将它们拖放到表单上,就像拖放表格和对话框一样。

      4) 如果您不想将 VoIP 组件拖放到表单上,那么您可以尝试在运行时使用 CoCreateInstance 创建它。但首先你必须阅读一些关于 Microsoft COM 的初学者教程。您可能会错过一些高级概念,但您应该了解最基本的东西,例如接口与类的相似之处和不同之处、它们的生命周期如何管理、COM 运行时如何为您的程序初始化和完成等等。

      5) 您也可以尝试绕过正确的 Windows 定位和加载服务器的方法,并尝试自己执行此操作,在正确的 DLL 中使用 DllGetClassObject 例程。如果图书馆是允许的,它将工作。但如果它确实依赖于 Windows 提供的服务,那么这些服务可能会导致各种崩溃和未达到的预期。

      如果我没记错的话,您可以在 delphi 的早期 HTML 帮助单元中找到该方法的示例。 Microsoft HTML 帮助提供了使用 CoCreateInstance 和运行时 ActiveX 服务器注册表的 late binding 或将 htmlhlp.ocx 视为 DLL 的 early binding。 Delphi 的早期版本的 HTML Help API 提供了这两个选项。但我可能在这里错了。

      【讨论】:

      • 问题是当 VOIP 库位于 'C:\Program Files (x86)\BigSpeed Voice SDK\' 中时程序全部正常运行,但我说我想尝试将库移动到我的程序文件夹如何使用 GUID 或其他方式再次链接它?
      • 为什么你认为你可以移动图书馆?为什么你认为图书馆可以使用错误的路径?
      • 阅读一些关于 COM 和 ActiveX 的基础知识。这些对象应在全局 Windows 命名空间中注册。您应该卸载该库,然后将其重新安装到非标准位置。如果允许的话。所有“只是移动它”的肮脏技巧可能会奏效,也可能会失败。而且,您在 Windows 方面的经验似乎远远低于超越 Windows 并使其以非标准方式工作所需的经验。
      • 您还可以使用 SysInternals 的 Process Monitor 查看您的程序在搜索移动到错误位置的库时尝试读取的磁盘路径和注册表路径。这可能会帮助您在自己的机器上超越它,但几乎不会在您客户的任何机器上。您正试图达到“不稳定的平衡”,其中任何微小的配置差异都可能意外地破坏您的程序、窗口和库之间的链接。你认为你有足够的经验来修复客户端计算机上的所有随机崩溃,而无需访问它们吗?我建议反对它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 1970-01-01
      • 2014-08-28
      • 2012-11-22
      • 2011-04-14
      • 1970-01-01
      相关资源
      最近更新 更多