Использование DLL с PHP для чайников

У меня есть проект, который должен получить доступ к DLL с PHP. Сервер является машиной Windows, а сервер Apache предоставляется XAMPP.

Я читаю несколько ответов в Интернете, как

Вот как я называю 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:

  1. Скомпилировано с использованием Delphi
  2. Это (конечно) самодельный
  3. Я получаю следующую ошибку 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&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)

:)

У меня была та же проблема, и я исправил несколько шагов:

  1. откройте командную строку в праве администратора (windows + r + тип 'cmd') и напишите PATH, где находится ваш dll-файл:
    C:\Windows\system32\regsvr32 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, все в порядке, однако на экране не должно отображаться сообщение об ошибке.


Если я не был уверен, дайте мне знать, и я сделаю все возможное в следующий раз:)

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