Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
pavelperminov
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 3
1

Как подключить dll (SmartCOM3.dll) к php через расширение php_com_dotnet?

01.10.2014, 23:04. Просмотров 1780. Ответов 8
Метки нет (Все метки)

Доброе время суток.

Передо мной встала задача через php подцепить SmartCOM3.dll. В мануале написано что подцепка dll делается через COM-расширение для php, которое я нашел, скачал (php_com_dotnet.dll), залил в extensions_dir и прописал в php.ini

Далее, для проверки того, работает ли расширение вообще, я написал
PHP
1
2
3
<?php
$word = new COM('word.application');
echo $word->Version;
И мне вывелась версия, тут все ок. Далее я скачал msi-установщик тут - http://www.itinvest.ru/editorfiles/F...up_3.0.109.msi, запустил его, после чего там-то там-то появился SmartCOM3.dll, который теперь и нужно подцепить

Для этой dll есть описание здесь - http://www.itinvest.ru/editorfiles/F...manual_3_0.pdf, и в нем упоминается имя одного из классов, содержащихся в dll, это "SmartCOM3Lib.StServerClass", и именно это имя я воткнул вместо "word.application", после чего обновил страницу в браузере, в реультате чего вылезла ошибка

Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `SmartCOM3Lib.StServerClass': Синтаксическая ошибка ' in D:\Server\vhosts\test\www\index.php:2 Stack trace: #0 D:\Server\vhosts\test\www\index.php(2): com->com('SmartCOM3Lib.St...') #1 {main} thrown in D:\Server\vhosts\test\www\index.php on line 2

Хочу отметить что перед тем, как менять "word.application" на "SmartCOM3Lib.StServerClass", я предварительно скопировал dll-ку в extension_dir, прописал ее в php.ini и перезапустил apache. Кроме того я выполнил команду "regsrv32 SmartCOM3.dll", чтобы зарегить dll в винде

Соответственно теперь у меня есть несколько вариантов на тему того, почему вылазит ошибка
1. Неправильно указан Application.ID Для ворда это "word.application", а для смарткома - "SmartCOM3Lib.StServerClass", ну по крайней мере я так подумал что для смарткома это он и есть, потому что именно такое название было упомянуто в pdf-документации, ссылку на которую я дал выше. То есть возможно этот Application.ID (первый аргумент при вызове "new COM(...)" в php) - на самом деле надо как-то по другому указывать
То есть здесь нужно как-то узнать правильный Application.ID для класса SmartCOM3Lib.StServerClass, имеющийся в SmartCOM3.dll. Как узнать правильный? Может есть какие-то специальные программы, которые открывают dll, и смотрят какие классы и какие методы в них есть?

2. Php вообще не видит SmartCOM3.dll. Как сделать чтобы увидел?

Как быть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2014, 23:04
Ответы с готовыми решениями:

Как установить расширение magickwand для PHP через ssh?
ОС Ubuntu 12.04. Вместе с imagemagick этот magickwand почему то не идёт в...

Не могу подключить php_zip.dll
Доброго времени суток! Никак не получается подключить php_zip.dll. Смотрела...

Где php хранит свои dll-ки?
Подскажите плиз, где php хранит свои dll файлы (типа php_pdo.dll). Как...

Unable to load dynamic library '/usr/lib/php/20151012/php_intl.dll __at Linux
Возникает ошибка --Unable to load dynamic library...

не работает "php_zip.dll" в PHP 5.3
У меня не работает &quot;php_zip.dll&quot; в PHP 5.3. Какие файлы &quot;php_zip.dll&quot; в инете...

8
ft4l
Невнимательный
218 / 191 / 79
Регистрация: 08.02.2013
Сообщений: 580
Записей в блоге: 1
02.10.2014, 08:56 2
Php вообще не видит SmartCOM3.dll. Как сделать чтобы увидел?
А что-то видит кроме php ?
например если сохранить как file.hta что-то такое
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>HTA</title>  
<HTA:APPLICATION
ID="main"
ICON="shell32.dll,8" APPLICATIONNAME="HTA" SINGLEINSTANCE="yes"
BORDER="Thick" INNERBORDER="no" CAPTION="yes" NAVIGABLE= "yes" SCROLL="no" SELECTION="yes"
/>
 
 
 
<script>
onerror=    handleLaunchErr
window.onload=  init
 
function handleLaunchErr(msg,url,l) { 
    alert('Ошибка:\n'+msg+'\nВ файле '+url+'\nСтрока '+l);
    return true;
}
 
function init() {
    alert(get_env('Process','APPDATA'));
    
}
 
function get_env(x, y) { // получение переменной
 var obj = new ActiveXObject("WSCRIPT.SHELL");
 var z = obj.Environment(x);
 var r=z(y);
 delete obj; obj=null;
 return r;
}
 
function getv_word() { // получение переменной
    var word = new ActiveXObject("word.application");
    alert(word.Version);
    delete word; word=null;
    return;
}
 
</script>
</head>
<body>
 
 
<a href"#" onclick="getv_word()">test word</a>
 
</body>
</html>
0
pavelperminov
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 3
03.10.2014, 16:47  [ТС] 3
Пробовал присланный вами код. Вместо "word.application" поставил "SmartCOM3Lib.StServerClass"

при клике по "test word" вылезло вот что:

Невозможно создание объекта сервером программирования объектов

потом поигрался с именем, имя "SmartCOM3.StServer" - сработало, ошибка не вылезла, вылезло "undefined",
видимо у этого объекта нет свойства Version

После этого попробовал имя "SmartCOM3.StServer" в своем php-коде - ошибки не вылезло, но страница грузилась, грузилась но так и не загрузилась.

Добавлено через 40 минут
Более того, попытки выполнить

PHP
1
2
<?php
com_load_typelib('SmartCOM3.StServer');
или

PHP
1
$com = new COM("SmartCOM3.StServer");
приводят к полному зависанию апача, и его приходится ребутать

может дело в каких-то настройках расширения php_com_dotnet?
потому что раз синтакс еррор не вылазит, значит по крайней мере имя com-объекта правильное
но раз зависает, то значит апач пытается инициализировать объект, но у него это не получается по каким-то причинам

Добавлено через 2 часа 12 минут
разобрался как сделать чтобы апач не зависал - надо было убрать упоминание о SmartCOM3.dll из php.ini
теперь код
PHP
1
2
<?php
$com = new COM("SmartCOM3.StServer");
выдает вот что

Fatal error: Uncaught exception 'com_exception' with message 'Failed to create COM object `SmartCOM3.StServer': Не найден указанный модуль.
' in D:\Server\vhosts\test\www\index.php:2
Stack trace:
#0 D:\Server\vhosts\test\www\index.php(2): com->com('SmartCOM3.StSer...')
#1 {main}
thrown in D:\Server\vhosts\test\www\index.php on line 2


Причем если вместо "SmartCOM3.StServer" вписать что-нибудь другое, то будет вылазить старый добрый синтакс еррор, про который я писал раньше

Добавлено через 8 минут
Обнаружилась еще одна странная хрень

после перезагрузки апача php-код нормально выполнился один раз, а на втором разе апач снова завис.
тут нужно упомянуть, что перед тем как стало все нормально (в предыдущем апдейте поста), я немного
поигрался с классом DOTNET

то есть теперь в итоге картина такая

после перезапуска апача код
PHP
1
2
3
<?php
$com = new COM("SmartCOM3.StServer");
var_dump($com);
срабатывает один раз, а при повторе апач виснет,
но если спереди добавить строчку

PHP
1
2
3
4
<?php
$com = new DOTNET('C:/Server/PHP/SmartCOM3.dll', 'SmartCOM3.StServer');
$com = new COM("SmartCOM3.StServer");
var_dump($com);
то вылезет ошибка
Fatal error: Uncaught exception 'com_exception' with message 'Failed to instantiate .Net object [CreateInstance] [0x80131047],

однако если после этой ошибки эту строчку (где через DOTNET объект создается) закомментить, то потом
все будет работать без зависаний апача (до следующей перезагрузки апача)

странно, но факт. ест идеи почему так?
0
Tatikoma
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
258 / 222 / 109
Регистрация: 07.07.2014
Сообщений: 965
03.10.2014, 18:00 4
Есть, он не знает где вашу DLL'ку искать.

Добавьте C:/Server/PHP в переменную окружения PATH.
0
ads
365 / 372 / 89
Регистрация: 01.12.2013
Сообщений: 1,629
03.10.2014, 18:45 5
Цитата Сообщение от pavelperminov Посмотреть сообщение
срабатывает один раз, а при повторе апач виснет,
вероятно объект не свойственный ни апачу ни пхп следует удалять явно по завершению скрипта.

Добавлено через 1 минуту
Цитата Сообщение от Tatikoma Посмотреть сообщение
Добавьте C:/Server/PHP в переменную окружения PATH
на сколько я знаю технологии com плевать на path. Эти библиотеки регистрируются в реестре виндовс.
0
Tatikoma
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
258 / 222 / 109
Регистрация: 07.07.2014
Сообщений: 965
03.10.2014, 18:47 6
Цитата Сообщение от ads Посмотреть сообщение
на сколько я знаю технологии com плевать на path. Эти библиотеки регистрируются в реестре виндовс.
Ок. Тогда предлагаю запустить FileMon - посмотреть где он ищет - подпихнуть в нужное место - профит.
0
ads
03.10.2014, 18:58
  #7

Не по теме:

возможно не в тему, но если ТС так заморочился, то возможно проще все сделать на C#? И язык как ни странно проще(в силу своей логичности) и надежней и быстрее и мощнее.. Тем более без знания дотнетовских технологи прикрутить не получится, а зная дотнет и имея соответствующие сервера - нафига php имхо

0
ft4l
Невнимательный
218 / 191 / 79
Регистрация: 08.02.2013
Сообщений: 580
Записей в блоге: 1
03.10.2014, 19:25 8
"regsrv32 SmartCOM3.dll", чтобы зарегить dll в винде
имя комманды с ошибкой и я-бы пробовал что-то вроде
regsvr32 -u SmartCOM3.dll
regsvr32 x:\Полный Путь\SmartCOM3.dll
// не помню но вроде как-то пытался что-то такое делать
или как оно должно быть положить dll в %windir%\system32 или SysWOW64 если 32x библиотека и php в 64x винде (system32 тоже подойдёт если программа выполняющая перемещение 32x и без учёта "File System Redirector")
Невозможно создание объекта сервером программирования объектов
такое вроде выдаёт если объект SmartCOM3 не зарегистрирован или м.б. не находит путь?

А текущий каталог php обычно /...../Apache/ , если php как модуль

Добавлено через 7 минут
хотя я незнаю надо курить мануалы, с сайта ms
0
pavelperminov
0 / 0 / 0
Регистрация: 01.10.2014
Сообщений: 3
05.10.2014, 13:15  [ТС] 9
всем спс за ответы, на текущий момент проблемы решены все, кроме одной

благодаря примеру
Цитата Сообщение от ft4l Посмотреть сообщение
А что-то видит кроме php ?
например если сохранить как file.hta что-то такое
+немного метода тыка удалось выяснить как
правильно нужно класс обзывать при обращении к нему

вторая проблема - зависание всего апача при попытке создания объекта чере new COM('SmartCOM3.StServer')
решилась убиванием ранее добавленного упоминания о dll-ке из php.ini

третьей проблемы, состоявшей в том что php не видит эту dll - как оказалось, не существует (это я про проблему), потому что после решения проблемы с зависанием апача var_dump(new COM('SmartCOM3.StServer')) выдавал
object(com)#1 (0) { } без зависания апача, правда только в первый раз, а на втором весь апач зависал

соответственно, осталась четвертая проблема, не решенная.
она заключается в том, что чтобы все хоть как-то работало, приходится иметь дело с костылем, состоящим из строчки №2 в коде
PHP
1
2
3
4
<?php
//$com = new DOTNET('C:/Server/PHP/SmartCOM3.dll', 'SmartCOM3.StServer');
$com = new COM("SmartCOM3.StServer");
var_dump($com);
и из необходимости ее раскомментирования, нажимания F5 в браузере, и снова закомментирования - и это все после каждой перезагрузки апача

тут писали
Цитата Сообщение от ads Посмотреть сообщение
вероятно объект не свойственный ни апачу ни пхп следует удалять явно по завершению скрипта.
- судя по всему, так и есть, только непонятно как этот объект удалять через php,

Добавлено через 3 минуты
Цитата Сообщение от pavelperminov Посмотреть сообщение
+немного метода тыка удалось выяснить как
правильно нужно класс обзывать при обращении к нему
здесь я кстати в реестре поискал по ключевому слову 'SmartCOM' , и пару вариантов обзывательств нашел, причем оба сработали, это 'SmartCOM3.StServer' и 'SmartCOM3.StServer.1'

Добавлено через 13 минут
Цитата Сообщение от pavelperminov Посмотреть сообщение
- судя по всему, так и есть, только непонятно как этот объект удалять через php,
есть такая php-функция com_get_active_object(), которая, если верить мануалу, отличается от 'new COM(...)' тем, что если объект уже создан, то она возвращает его, вместо попытки создания нового такого же. Но у меня эта вызов этой функции - com_get_active_object('SmartCOM3.StServer') - выдает вот что
Fatal error: Uncaught exception 'com_exception' with message 'Операция недоступна ' in D:\Server\vhosts\test\www\index.php:4 Stack trace: #0 D:\Server\vhosts\test\www\index.php(4): com_get_active_object('SmartCOM3.StSer...') #1 {main} thrown in D:\Server\vhosts\test\www\index.php on line 4
0
05.10.2014, 13:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2014, 13:15

Как сделать, чтобы в адресной строке не отображалось расширение php?
как сделать чтоб не высвечивалась приставка php? и заходить что б можно было

Как подключить шаблон к php
Учусь самописные сайты делать, не могу понять как к index.php подклячить html...

Php+html!? Как в php файле вывести input type='button' через echo!?
ну собственно говоря я все спросил в заголовке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru