使用DLL与PHP的傻瓜



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

我在网上看到了很多答案,比如

    在PHP中使用DLL ?
  • php与dll通信?
  • 通过php调用dll
  • http://ca.php.net/manual/en/class.com.php
  • http://ca2.php.net/manual/en/book.w32api.php
  • http://www.talkphp.com/absolute-beginners/3340-php-how-load-com-dll-file.html

下面是我如何在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
  4. 注册DLL时,我得到以下错误the DllRegister Server entry point was not found

不注册regsvr32可以使用吗?

创建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]] dllname

/u -注销服务器

/i -调用DllInstall传递一个可选的[cmdline];当与/u一起使用时,调用DLL uninstall

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

一起使用

/s -沉默;不显示消息框(随Windows XP和Windows Vista添加)

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

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

  1. 以管理员权限打开命令行(windows + r +键入'cmd')写下你的dll文件所在的路径:
    C:Windowssystem32regsvr32 xwizards.dll(它的例子)
    一个窗口显示"DLLRegisterServer success"
  2. 检查你的phpinfo()如果你是com_dotnet扩展
  3. 现在写入您的PHP代码:

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

    现在如果你知道如何管理你的dll的类和函数,它就会正常运行,但是屏幕上不会出现错误提示


如果我没说清楚,请告诉我,下次我会尽力的。

使用PHP>=7.4.0的新FFI/外部函数接口(在发布此问题时还不存在),现在比以往任何时候都容易!例如,调用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)

:)

Linux/Apache服务器无法访问DLL。

最新更新