Использование 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?


person David Laberge    schedule 21.12.2011    source источник
comment
Какой CLSID вашего COM-класса? Я подозреваю, что вы не создаете DLL, готовую к COM-взаимодействию...   -  person Thorsten Dittmar    schedule 21.12.2011
comment
Все, что я когда-либо читал на эту тему, говорит мне, что способ сделать это — написать оболочку C++ для DLL, которую можно встроить в расширение PHP, и использовать ее таким образом. Я никогда не пытался это сделать и не могу сказать вам, как, но я сталкивался с этим вопросом раньше (вы связались с парой людей, задающих тот же вопрос), и я никогда не видел, чтобы кто-нибудь говорил, что у меня это работает, если только они построил расширение.   -  person DaveRandom    schedule 21.12.2011
comment
@ThorstenDittmar CLSID — это буквенно-цифровая строка в следующем формате XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Что вы подразумеваете под DLL, готовой к COM-взаимодействию?   -  person David Laberge    schedule 21.12.2011
comment
@DavidLaberge CLSID (я думаю) технически является UUID, и, возможно, его нужно обернуть в {} при использовании в этом контексте   -  person DaveRandom    schedule 21.12.2011
comment
Что ж, из того, что я видел по ссылкам и вашему вопросу, вы должны зарегистрировать свою DLL в системе и зарегистрировать класс COM, который затем можно использовать из PHP. Если вы этого не сделаете, это не сработает.   -  person Thorsten Dittmar    schedule 21.12.2011
comment
Тот факт, что вы получаете ошибку the DllRegister Server entry point was not found, означает, что что-то не так с вашей DLL. Убедитесь, что вы правильно определили точки входа и экспортировали таблицы. Не идите дальше, пока не исправите эту ошибку.   -  person Hossein    schedule 11.01.2012
comment
@Hossein Спасибо, но можно ли его использовать без регистрации в regserv32?   -  person David Laberge    schedule 11.01.2012
comment
Если использование clsid — единственный способ, которым ваш код распознает DLL, вы должны это сделать. Для COM PHP также необходимо зарегистрировать. Убедитесь, что вы реализовали DllRegister и экспортировали его. Вы должны рассказать, что вы уже пробовали (исходный код DLL и PHP).   -  person Hossein    schedule 11.01.2012


Ответы (3)


При создании 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]] имя_dll

/u - Отменить регистрацию сервера

/i — вызвать DllInstall, передав ему необязательную [командную строку]; при использовании с /u вызывает удаление dll

/n - не вызывать DllRegisterServer; эта опция должна использоваться с /i

/с – молчать; не отображать окна сообщений (добавлено в Windows XP и Windows Vista)

В конечном счете, прежде чем вы попытаетесь заставить DLL работать с PHP, вы должны убедиться, что ваша DLL работает в целом.

person Jeremy Harris    schedule 12.01.2012

Доступ к DLL с сервера Linux/Apache невозможен. Поэтому проект был закрыт.

person David Laberge    schedule 17.01.2012
comment
Сервер — это машина Windows, а сервер Apache предоставляется XAMPP. - person gadget00; 23.04.2019
comment
Это вообще не про линукс. - person Gogowitsch; 28.05.2019
comment
Wine проект может использовать библиотеки DLL в Linux, вы можете вызывать Wine из PHP (shell_exec(), proc_open( ), и т.д) - person hanshenrik; 31.05.2020

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

  1. откройте командную строку с правами администратора (windows + r + введите 'cmd') напишите ПУТЬ, где находится ваш файл 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";}
    

    Now if you know how manage the class and the function of you're dll it's going ok,however no error massage should show up on your screen


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

person UserHelpNeeding02356    schedule 25.01.2017
comment
Не могли бы вы дать более подробную информацию и, возможно, рабочий пример? Я нахожусь в том месте, где он больше не говорит, что не может открыть файл. Теперь он просто говорит, что класс не зарегистрирован. Так что я ближе к решению здесь. Я работаю с .NET dll. - person Bitterblue; 26.07.2018
comment
Этот подход привел к чтению ошибки: Не удалось создать COM-объект `dllName.dllClass': Недопустимый синтаксис. Не могли бы вы подсказать, в чем причина этой ошибки? - person Jacob Collins; 01.06.2021