在 PHP 中使用 DLL for Dummies

新手上路,请多包涵

我有一个需要使用 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. 我收到以下错误 the DllRegister Server entry point was not found 当我尝试使用 regsvr32

它可以在不注册的情况下使用 regsvr32 吗?

原文由 David Laberge 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 868
2 个回答

创建 DLL 文件时,需要使用 模块定义文件。它将包含类似于此的内容:

 ;
;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]] dll 名称

/u - 注销服务器

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

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

/s——静默;不显示消息框(随 Windows XP 和 Windows Vista 一起添加)

最后,在您尝试使 DLL 与 PHP 一起工作之前,您需要确保您的 DLL 通常可以正常工作。

原文由 Jeremy Harris 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 PHP>=7.4.0 的新 FFI/Foreign 函数接口(发布此问题时尚不存在),现在比以往任何 时候 都容易!例如,调用 GetCurrentProcessId(); 来自 kernel32.dll 的函数:

 <?php

declare(strict_types=1);
$ffi = FFI::cdef(
    'unsigned long GetCurrentProcessId(void);',
    "C:\\windows\\system32\\kernel32.dll"
);
var_dump($ffi->GetCurrentProcessId());

产出

C:\PHP>php test.php
int(24200)

:)

原文由 hanshenrik 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏