У меня возникают трудности с использованием COM-компонента на веб-сайте, созданном с использованием PHP, работающего на IIS. Это похоже на проблему с разрешениями, но после нескольких дней игры с разрешениями я уже не приблизился к тому, чтобы заставить его работать, поэтому ищу идеи.
Это Windows Server 2012 R2, ISS 8.0 с PHP 7.0.
Компонент COM создается с использованием пакета MATLAB Compiler SDK R2017b.
Все 64-битное.
COM-компонент может быть правильно выполнен из Python, используя
import win32com.client
obj = win32com.client.Dispatch("AddMatrixTestCOM.MATLABTest.1_0")
ans = obj.addmatrix(1,100,3,4)
print ans
Следовательно, компонент COM и соответствующее время выполнения компонента (MCR) MATLAB правильно зарегистрированы / установлены. (MCR — это, по сути, механизм времени выполнения, который вызывается компонентом COM. Он состоит из различных библиотек DLL.)
Чтобы протестировать вызов COM-компонента из PHP, я написал свой собственный COM-компонент (т.е. не использующий MATLAB). Это можно успешно вызвать, используя
$my_dll = new COM('SimpleAddCOM');
$outvar = $my_dll->add_ints(1, 2);
echo $outvar;
Следовательно, все соответствующие настройки php.ini установлены для вызова COM.
(Компонент COM создается в Visual Studio 2015, и на сервере установлены соответствующие библиотеки развертывания.)
Тем не менее, я не могу заставить следующее работать,
$my_dll = new COM('AddMatrixTestCOM.MATLABTest.1_0');
$outvar = $my_dll->addmatrix(1, 100, 3, 4);
echo $outvar;
В первой строке выдается ошибка: Failed to create COM object 'AddMatrixTestCOM.MATLABTest.1_0': ClassFactory cannot supply requested class
Номер конкретной ошибки: 2147746065
Я считаю, что COM-компонент обнаружен, так как ошибка отличается, если я пытаюсь создать экземпляр компонента, который не существует, но не может преодолеть (или действительно понять) cannot supply requested class
часть.
Я дал различным пользователям полные права на каталоги, содержащие MCR и компонент COM.
(Исходя из различных вопросов / ответов о переполнении стека, имеющих схожую с этим тему, я начал с предоставления разрешений IIS_IUSRS, затем IUSR, затем NETWORK SERVICES и, наконец, добавив «Все».
Ничего из этого не сработало.)
Чего мне не хватает в том, что я не могу склеить IIS и мой COM-компонент?
редактировать
Вот еще немного информации:
Sites
узел диспетчера IIS указывает, что мой сайт использует пул приложений mypool
,Application Pools
узел диспетчера IIS указывает, что идентичность mypool
является IWPD_1(myname)
mypool
Идентичность указана как ApplicationPoolIdentity
, (Почему они различны и соответствует ли IIS одному другому?)Я дал DefaultAppPool
, а также myname
а также IWPD_1(myname)
полные права доступа к каталогам, содержащим мои COM DLL и MCR.
У кого-нибудь есть что-то еще, что я могу попробовать, прежде чем отказаться от IIS и просто вернуться на хост Linux?
Это на самом деле не отвечает на мой вопрос, но это обходной путь, который может помочь другим.
Я закончил тем, что изменил Load User Profile
настройка для моего пула приложений на true
, Это создает профиль под C:\Users
для учетной записи, используемой пулом приложений, с соответствующими разрешениями для доступа пользователя пула приложений. Затем я установил MATLAB MCR и нашел мои dll в каталогах внутри Documents
каталог этого профиля пользователя.
Я еще не исследовал последствия этого для безопасности, но это заставляет меня переживать, что код не работает.
Других решений пока нет …