在Azure上使用PHP从进程外COM组件调用方法
我编写了一个简单的PHP脚本,它为进程外(即exe文件)COM组件实例化COM对象,并使用它调用组件公开的COM方法。这个COM方法非常简单,将作为第一个参数传递的数字增加了四倍,并在第二个参数(通过引用传递)中返回结果。下面显示的脚本在我的本地开发机器WAMPServer2.0(Apache2.2.11/PHP5.3.1)上成功运行。COM组件是使用Delphi构建的Win32可执行文件在Azure上使用PHP从进程外COM组件调用方法,php,azure,com,out-of-process,Php,Azure,Com,Out Of Process,我编写了一个简单的PHP脚本,它为进程外(即exe文件)COM组件实例化COM对象,并使用它调用组件公开的COM方法。这个COM方法非常简单,将作为第一个参数传递的数字增加了四倍,并在第二个参数(通过引用传递)中返回结果。下面显示的脚本在我的本地开发机器WAMPServer2.0(Apache2.2.11/PHP5.3.1)上成功运行。COM组件是使用Delphi构建的Win32可执行文件 <?php // ensure no time limit is imposed set_t
<?php
// ensure no time limit is imposed
set_time_limit(0);
// show all errors, warnings and notices whilst developing
error_reporting(E_ALL);
$numIn = 3;
$numOut = new VARIANT(1, VT_I4);
echo '----- BEFORE ---------' . '<br>';
echo 'NumIn: ' . $numIn . '<br>';
echo 'NumOut: ' . $numOut . '<br>';
echo '----------------------' . '<br>';
$oleapp = new COM("OleAutomationFeasibilityModel.Automation") or die ("Could not initialise feasibility model object.");
echo '<br />COM object created version = ' . $oleapp->Version . '<br /><br />';
$oleapp->CalculateWithVariants($numIn, $numOut);
unset($oleapp);
echo '----- AFTER ---------' . '<br>';
echo 'NumIn: ' . $numIn . '<br>';
echo 'NumOut: ' . $numOut . '<br>';
echo '----------------------' . '<br>';
?>
然后,我运行了上述脚本几次,并重新检查了应用程序事件查看器,但没有记录任何内容
我还检查了IIS日志和Azure
日志
,启动任务日志
和启动任务错误日志
文件,但没有结果。去年放弃解决此问题后。本周,我再次齐心协力解决了这个问题,并取得了成功
我基本上需要(a)启用php\u com\u dotnet.dll以允许使用com
和VARIANT
类,以及(b)向IIS\u IUSRS
授予默认本地激活权限以允许访问com组件。我在下面列出了我采取的详细步骤
COM
和变体
类,则需要在
php.ini。以前版本的PHP通过以下方式启用了这些扩展:
默认值(来源:)。在里面
在php文件夹中,创建一个仅包含以下内容的php.ini文件
台词
IIS\u IUSRS
授予默认本地激活权限
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\OLE]
"DefaultLaunchPermission"=hex(3):01,00,04,80,74,00,00,00,84,00,00,00,00,00,\
00,00,14,00,00,00,02,00,60,00,04,00,00,00,00,00,14,00,1F,00,00,00,01,01,00,\
00,00,00,00,05,12,00,00,00,00,00,18,00,1F,00,00,00,01,02,00,00,00,00,00,05,\
20,00,00,00,20,02,00,00,00,00,18,00,0B,00,00,00,01,02,00,00,00,00,00,05,20,\
00,00,00,38,02,00,00,00,00,14,00,1F,00,00,00,01,01,00,00,00,00,00,05,04,00,\
00,00,01,02,00,00,00,00,00,05,20,00,00,00,20,02,00,00,01,02,00,00,00,00,00,\
05,20,00,00,00,20,02,00,00
我不知道上述注册表更改是否适用于所有人,因此我使用的过程都有文档记录(它主要涉及使用一个名为的程序来记录在COM Security中为IIS\u IUSR
授予默认本地激活权限时对注册表所做的更改,并将注册表更改作为.reg文件保存到web角色的bin文件夹中)chcp 1252>NUL
OleAutomationFeasibilityModel.exe /regserver
regedit.exe /s SetDCOMPermission.reg
exit /b 0
<Task commandLine="RegisterOleAutomationFeasibilityModel.cmd" executionContext="elevated" />
希望这对处于类似情况的人有所帮助!可能值得检查应用程序事件日志以查看IIS是否记录了任何内容。感谢@Dreamwalker的评论。WMI在启动云服务期间记录的错误是否相关(请参阅上面的更新)?不,我认为这与此无关。请确保检查警告,以及它可能不会被记录为错误
chcp 1252>NUL
OleAutomationFeasibilityModel.exe /regserver
regedit.exe /s SetDCOMPermission.reg
exit /b 0
<Task commandLine="RegisterOleAutomationFeasibilityModel.cmd" executionContext="elevated" />