我有一个需要用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信息:
- 使用Delphi编译
- 当然是国产的
- 当我尝试用
regsvr32
注册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可以正常工作。
我有同样的问题,我修复了一些步骤:
- 以管理员权限打开命令行(windows + r +键入'cmd')写下你的dll文件所在的路径:
C:Windowssystem32regsvr32 xwizards.dll
(它的例子)
一个窗口显示"DLLRegisterServer success" 检查你的phpinfo()如果你是com_dotnet扩展 现在写入您的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。