Использование 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:
- Скомпилировано с использованием Delphi
- Это (конечно) домашнее
- Я получаю следующую ошибку
the DllRegister Server entry point was not found
, когда я пытаюсь зарегистрировать DLL с помощью regsvr32
Можно ли его использовать без регистрации с помощью regsvr32
?
Ответы
Ответ 1
Когда вы создаете свой 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 работает вообще.
Ответ 2
Невозможно получить доступ к DLL с сервера Linux/Apache. Поэтому проект был снижен.
Ответ 3
У меня была та же проблема, и я исправил некоторые шаги:
- откройте командную строку справа от администратора (windows + r + type 'cmd).
напишите PATH, где вы - ваш DLL файл:
C:\Windows\system32>regsvr32 xwizards.dll
(это пример). Появится окно с "успехом DLLRegisterServer"
- проверьте ваш 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, все будет хорошо, однако на вашем экране не должно появиться сообщение об ошибке.
Если я не был ясен, дайте мне знать, и я сделаю все возможное в следующий раз:)