【问题标题】:What's the best method to load a dll in php?在 php 中加载 dll 的最佳方法是什么?
【发布时间】:2016-09-12 15:15:10
【问题描述】:

我正在服务器端使用 CakePHP 开发一个 Web 应用程序,我需要使用第 3 方提供的 dll 来访问他们的平台,所以我没有 dll 的源代码,我可以'不要修改它。我对此进行了搜索,但没有找到一种简单的方法。

在 php 中加载 dll 的最佳方法是什么?

我应该构建一个 php 扩展来作为第 3 方 dll 的包装器吗?

还有其他方法吗?

提前致谢。

更新

我发现我可以将 dll 用作 COM 对象,但是每次客户端需要部署服务器时,我都需要在 Windows 上注册 dll,我想要一个不涉及注册 dll 的解决方案.

更新

我尝试注册 dll,但出现错误(“找不到入口点 DllRegisterServer”),这意味着它可能未编译为用作 COM 对象。我认为唯一的选择是创建一个包装 dll 的 C/C++ php 扩展或创建一个包装 dll 并使用 DOTNET php 扩展的 C++/C# COM 对象。

【问题讨论】:

  • 您正在运行 Windows 对吗?您需要混合使用 PHP 的 exec()stackoverflow.com/questions/3044395/how-do-i-execute-a-dll-file
  • 我不认为这样做,因为我需要调用 dll 中的一个方法,该方法将返回一个对象,然后从该对象调用一些方法。我发现我可以将 dll 用作 COM 对象,但每次客户端需要部署服务器时,我都需要在 Windows 上注册 dll。
  • 您的部署脚本不能自动注册 DLL 吗?
  • 我尝试注册 dll,但出现错误(“找不到入口点 DllRegisterServer”),这意味着它可能未编译为用作 COM 对象。我认为唯一的选择是创建一个包装 dll 的 C/C++ php 扩展或创建一个包装 dll 并使用 DOTNET php 扩展的 C++/C# COM 对象。

标签: php windows dll com php-extension


【解决方案1】:

我最终为 dll 实现了一个 .NET COM 可见包装器,我导入了这样的 dll 函数:

[DllImport("dapi.dll", EntryPoint = "#100", PreserveSig = false,
         CallingConvention = CallingConvention.StdCall)]
    public static extern Idapi CreateDapi();

我使用 cmd 中的 regasm.exe 实用程序将 Wrapper 注册为 COM 对象:

regasm /codebase dapiWrapper.dll

我在 php 中实例化了 COM 对象,如下所示:

$this->dapiCom = new COM("DapiWrapper.DapiWrapper") or die("Error");

【讨论】:

  • 我知道这是旧的,但我需要知道,如果这种方法可以在 linux Env​​(ubuntu 或 debian)上导入,专门用于容器。
  • 它是 .dll 还是 .so 库?如果它是 .dll,我不确定您是否可以使用 Wine 在 Linux 上从 PHP 访问 COM 对象,因此最好的选择是使用运行 Windows 或 Wine/Mono 的 VM 或 PC,将 .dll 包装加载到 .NET项目并通过使用 SOAP 或 JSON 的 Web 服务公开其功能,然后从 PHP 使用 Web 服务。如果它是 .so,那么您可能必须创建一个包装 .so 库的 PHP 扩展并将其添加到您的 PHP 安装中。
  • 它是一个 .dll,我正在尝试使用 github.com/taviso/loadlibrary 进入 C 共享对象
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 2010-10-11
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多