Использовать DLL в PHP?
Я не собираюсь лгать. Я не все знакомы с Windows и COM-объектами. Вот почему я здесь. Прежде всего, возможно ли получить доступ к DLL из скрипта PHP, работающего без Apache? В моем путешествии по интернету я считаю, что у меня есть 2 варианта:
- скомпилируйте dll как расширение для PHP. (Я не сделал это DLL)
- получить доступ к DLL как к COM-объекту, который в любом случае является тем, для чего он предназначен.
Так что я принимаю подход COM.
try{
$com = new COM('WHAT_GOES_HERE');
} catch(Exception $e){
echo 'error: ' . $e->getMessage(), "\n";
}
Как мне узнать, что входит в строку инициализации? Есть ли программа типа Com Viewer, которую я мог / должен использовать, чтобы узнать это? документация, связанная с этой DLL, похоже, не указывает, какие строки я должен использовать для инициализации, но очень подробно рассказывает о доступных потоках и всяких забавных вещах. просто должен пройти этот начальный горб. Пожалуйста помоги!
4 ответа
WHAT_GOES_HERE
ProgID, Class ID или Moniker, зарегистрированные в операционной системе.
Каждый из них может быть изменен для одной и той же DLL, зарегистрированной на разных машинах. Есть несколько способов найти ProgID/CLSID/Moniker зарегистрированной библиотеки DLL. Вы можете найти в Интернете "dll debugger", "dll export", "dll inspect", и вы увидите несколько решений, а также способы показать, какие функции dll экспортируют, чтобы вы могли их использовать.
Самый простой способ, вы можете просто зарегистрировать dll с помощью Regsvr32.exe и выполнить поиск в реестре Windows с помощью regedit.exe по имени dll, возможно, вам придется искать несколько раз, пока не найдете ключ в \HKEY_CLASSES_ROOT\
, который является ProgID.
Команда dcomcnfg.exe показывает много информации о COM-объектах.
Если у вас есть Visual Studio, может быть полезен OLE/COM Object Viewer (oleview.exe).
Вы можете запускать функции dll (из dll, которые не являются расширениями php) с помощью winbinder. http://winbinder.org/ Использовать это просто. Вы должны скачать php_winbinder.dll и включить его в php.ini как расширение. В скрипте php вы должны использовать нечто подобное:
function callDll($func, $param = "")
{
static $dll = null;
static $funcAddr = null;
if ($dll === null)
{
$dll = wb_load_library(<DLL PATH AND FILENAME>);
}
$funcAddr = wb_get_function_address($func, $dll);
if ($param != "")
{
return wb_call_function($funcAddr,array(mb_convert_encoding($param,"UTF-16LE")));
}
else
{
return wb_call_function($funcAddr);
}
}
Вы можете просто разработать оболочку вокруг вашей основной библиотеки и использовать эту оболочку как расширение в вашем PHP. Некоторые бесплатные инструменты, такие как SWIG, могут генерировать эту обертку для вас автоматически, получая заголовок ваших функций dll. Я сам использую этот подход, и это было легко и надежно.
С новым интерфейсом 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)
:)