Использование DLL с PHP для чайников
У меня есть проект, который должен получить доступ к DLL с PHP. Сервер является машиной Windows, а сервер Apache предоставляется XAMPP.
Я читаю несколько ответов в Интернете, как
- Использовать DLL в PHP?
- php связь с dll?
- вызывая dll через php
- 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
Вот как я называю DLL в HTA
/ Javascript
:
<object style="display:none" id="SOME_ID" classid="clsid:SOME_CLASS_ID" codebase="./somePath.dll"></object>
У кого-нибудь есть рабочий пример?
Вот что я пробовал до сих пор в PHP:
$obj = new COM('pathTo.dll');
Информация о DLL:
- Скомпилировано с использованием Delphi
- Это (конечно) самодельный
- Я получаю следующую ошибку
the DllRegister Server entry point was not found
когда я пытаюсь зарегистрировать DLL сregsvr32
Можно ли использовать без регистрации в regsvr32
?
4 ответа
Когда вы создаете файл 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 удалить
/ n - не вызывать DllRegisterServer; эта опция должна использоваться с / i
/ s - Тихий; не отображать окна сообщений (добавлено в Windows XP и Windows Vista)
В конечном итоге, прежде чем пытаться заставить DLL работать с PHP, необходимо убедиться, что ваша DLL работает в целом.
Не удается получить доступ к DLL с сервера Linux/Apache. Поэтому проект был отброшен.
С новым интерфейсом FFI/Foreign Function в PHP&gt;=7.4.0 (которогоеще не существовало , когда этот вопрос был опубликован), это стало проще, чем когда-либо прежде! Например, для вызова 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)
:)
У меня была та же проблема, и я исправил несколько шагов:
- откройте командную строку в праве администратора (windows + r + тип 'cmd') и напишите PATH, где находится ваш dll-файл:
C:\Windows\system32\regsvr32 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, все в порядке, однако на экране не должно отображаться сообщение об ошибке.
Если я не был уверен, дайте мне знать, и я сделаю все возможное в следующий раз:)