Использовать DLL в PHP?

Я не собираюсь лгать. Я не все знакомы с Windows и COM-объектами. Вот почему я здесь. Прежде всего, возможно ли получить доступ к DLL из скрипта PHP, работающего без Apache? В моем путешествии по интернету я считаю, что у меня есть 2 варианта:

  1. скомпилируйте dll как расширение для PHP. (Я не сделал это DLL)
  2. получить доступ к 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&amp;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)

:)

Другие вопросы по тегам