【问题标题】:Using a DLL With PHP for Dummies将 DLL 与 PHP 一起用于傻瓜
【发布时间】:2012-01-25 07:30:57
【问题描述】:

我有一个项目需要使用 PHP 访问 DLL。服务器为 Windows 机器,Apache 服务器由 XAMPP 提供。

我在网上阅读了多个答案,例如

这是我在HTA / Javascript 中调用 DLL 的方式:

<object style="display:none" id="SOME_ID" classid="clsid:SOME_CLASS_ID" codebase="./somePath.dll"></object>

有人有工作示例吗?

这是我迄今为止在 PHP 中尝试过的:

$obj = new COM('pathTo.dll');

DLL 信息:

  1. 使用 Delphi 编译
  2. (当然)是自制的
  3. 当我尝试使用 regsvr32 注册 DLL 时,我收到以下错误 the DllRegister Server entry point was not found

不用regsvr32注册就可以使用吗?

【问题讨论】:

  • COM 类的 CLSID 是什么?我怀疑你没有创建一个为 COM 互操作做好准备的 DLL...
  • 我读过的关于这个主题的所有内容都告诉我,这样做的方法是为可以构建到 PHP 扩展中的 DLL 编写一个 C++ 包装器,并以这种方式使用它。我从来没有尝试过,也不能告诉你怎么做,但我以前遇到过这个问题(你链接到几个人问同样的问题),我从来没有见过有人说“我让它工作了”除非他们构建了一个扩展。
  • @ThorstenDittmar CLSID 是一个字符串 AlphaNumeric 字符串,格式如下 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。准备好用于 COM 互操作的 DLL 是什么意思
  • @DavidLaberge CLSID(我认为)在技术上是UUID,在这种情况下使用时可能需要包裹在{}
  • 好吧,从我在链接和你的问题中看到的,你必须向系统注册你的 DLL 并注册一个你可以从 PHP 中使用的 COM 类。如果你不这样做,它就行不通。

标签: php dll xampp ocx


【解决方案1】:

创建 DLL 文件时,您需要使用module definition file。它将包含与此类似的内容:

;
;contains the list of functions that are being exported from this DLL
;

DESCRIPTION     "Simple COM object"

EXPORTS
                DllGetClassObject       PRIVATE
                DllCanUnloadNow         PRIVATE
                DllRegisterServer       PRIVATE
                DllUnregisterServer     PRIVATE

该定义允许 regsvr32 找到 DllRegisterServer 入口点。

您可以尝试的另一个选项是将 /n 标志传递给 regsvr32。

Regsvr32 [/u] [/n] [/i[:cmdline]] dllname

/u - 注销服务器

/i - 调用 DllInstall 并传递一个可选的 [cmdline];与 /u 一起使用时调用 dll 卸载

/n - 不调用 DllRegisterServer;此选项必须与 /i 一起使用

/s – 静音;不显示消息框(随 Windows XP 和 Windows Vista 添加)

最终,在您尝试使 DLL 与 PHP 一起工作之前,您需要确保您的 DLL 能够正常工作。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我修复了一些步骤:

    1. 以管理员权限打开命令行(windows + r + type 'cmd') 将路径写入您的 dll 文件:
      C:\Windows\system32\regsvr32 xwizards.dll(示例)
      显示“DLLRegisterServer 成功”的窗口
    2. 如果您是 com_dotnet 扩展程序,请检查您的 phpinfo()
    3. 现在写入您的 PHP 代码:

          try    {
        $dll = new COM('<theNameOfDllFile>.<NameOfTheClass>'); //without extension '.dll' for theNameOfDllFile
        $dll->Function(); 
        } catch(Exception $e){
          echo 'error: ' . $e->getMessage(), "\n";}
      

      现在,如果你知道如何管理类和你的 dll 的功能,那就没问题了,但是你的屏幕上不应该出现任何错误消息


    如果我不清楚,请告诉我,下次我会尽力而为:)

    【讨论】:

    • 您能否提供更多详细信息以及一个可行的示例?我正处于不再说“无法打开文件”的地步。现在它只是说“课程未注册”。所以我更接近这里的解决方案。我正在使用 .NET dll。
    • 此方法导致读取错误:无法创建 COM 对象 `dllName.dllClass':语法无效。您能否就导致此错误的原因提出建议?
    【解决方案3】:

    无法从 Linux/Apache 服务器访问 DLL。因此该项目被放弃了。

    【讨论】:

    • "服务器为Windows机器,Apache服务器由XAMPP提供。"
    • 这根本与 Linux 无关。
    • Wine project 可以在 Linux 上使用 DLL,你可以从 PHP 调用 Wine(shell_exec()、proc_open() 等)
    猜你喜欢
    • 2011-10-12
    • 2012-06-22
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多