Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Azure上使用PHP从进程外COM组件调用方法_Php_Azure_Com_Out Of Process - Fatal编程技术网

在Azure上使用PHP从进程外COM组件调用方法

在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脚本,它为进程外(即exe文件)COM组件实例化COM对象,并使用它调用组件公开的COM方法。这个COM方法非常简单,将作为第一个参数传递的数字增加了四倍,并在第二个参数(通过引用传递)中返回结果。下面显示的脚本在我的本地开发机器WAMPServer2.0(Apache2.2.11/PHP5.3.1)上成功运行。COM组件是使用Delphi构建的Win32可执行文件

<?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组件。我在下面列出了我采取的详细步骤

  • 在web角色的bin文件夹中添加一个名为php的文件夹

  • 从PHP 5.3.15/5.4.5开始,为了使用
    COM
    变体
    类,则需要在 php.ini。以前版本的PHP通过以下方式启用了这些扩展: 默认值(来源:)。在里面 在php文件夹中,创建一个仅包含以下内容的php.ini文件 台词

  • 在包含以下内容的bin文件夹中创建一个SetDCOMPermission.reg文件,以向
    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文件夹中)

  • 将进程外COM组件(OleAutomationFeasibilityModel.exe文件)复制并粘贴到bin文件夹中

  • bin文件夹中创建一个registerLeaAutomationFeasibilityModel.cmd文件,以注册COM组件并设置启动它所需的权限

    chcp 1252>NUL
    OleAutomationFeasibilityModel.exe /regserver
    regedit.exe /s SetDCOMPermission.reg
    exit /b 0
    
  • ServiceDefinition.csdef文件中,在关闭启动标记之前插入对.cmd文件的引用

    <Task commandLine="RegisterOleAutomationFeasibilityModel.cmd" executionContext="elevated" />
    
    
    
  • 发布web角色


  • 希望这对处于类似情况的人有所帮助!

    可能值得检查应用程序事件日志以查看IIS是否记录了任何内容。感谢@Dreamwalker的评论。WMI在启动云服务期间记录的错误是否相关(请参阅上面的更新)?不,我认为这与此无关。请确保检查警告,以及它可能不会被记录为错误
    chcp 1252>NUL
    OleAutomationFeasibilityModel.exe /regserver
    regedit.exe /s SetDCOMPermission.reg
    exit /b 0
    
    <Task commandLine="RegisterOleAutomationFeasibilityModel.cmd" executionContext="elevated" />