我编写了一个简单的 PHP 脚本,它为进程外(即 exe 文件)COM 组件实例化 COM 对象,并使用它来调用组件公开的 COM 方法。这个 COM 方法非常简单地将作为第一个参数传递的数字翻了四倍,在第二个参数中返回结果(通过引用传递)。下面显示的脚本在我的 WampServer 2.0 (Apache 2.2.11 / PHP 5.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>';
?>
注意:据我了解,只能通过引用使用 VARIANT 类型的 COM 方法来传递参数,因为整数和字符串等常见数据类型不起作用(请参阅http://www.php.net/manual/ zh/ref.com.php#45038)。
然后,我创建并部署了一个带有启动脚本的 Azure Web 角色(云服务),该脚本成功注册了 COM 组件,即相应的注册表项出现在注册表中。为了进一步确认可以与 COM 组件交互,我使用 RDP 连接到云服务实例并安装了 Microsoft Access Runtime 2010,因为我有一个 Access 应用程序,它提供了一个 GUI 来测试 COM 组件的方法。我能够运行这个应用程序并成功地与 COM 组件交互,使用它向CalculateWithVariants方法传递一个整数并返回预期的四倍结果。因此,我已经确定 COM 组件已安装并且可以在 Azure 云服务实例上进行交互。
接下来我将上面的 PHP 脚本包含在 Web Role 中,并将其部署在 Azure 上。不幸的是,从浏览器调用脚本会导致 HTTP 错误 500(内部服务器错误),我正在努力找出原因。如果我注释掉所有引用的行$oleapp,我仍然会得到同样的错误。如果我另外注释掉实例化变体对象的行,则不会发生错误。如果我恢复实例化 COM 对象的行和它下面的行,我不会收到错误消息,但唯一回显的文本来自 COM 对象创建行之前的行,即对Version方法的调用失败。因此,它似乎正在努力创建变体对象和创建 COM 对象。
我对如何解决这个问题有点困惑。因此,如果有人对前进的道路有任何指示,我将不胜感激。
更新 1
我决定在 Azure 平台上尝试不同的行动方案...
- 使用 Windows Server 2008 R2 操作系统创建 Azure虚拟机
- 在 VM 中安装WampServer 2.2E (Apache 2.2.22 / PHP 5.3.13 / MySQL 5.5.24) 作为测试这种方法是否可行的快速简便的方法
- 将上述 PHP 脚本复制到 WampServer “www 目录”
- 启动 WampServer
- 从 WampServer 菜单中选择“Put Online”选项(通过左键单击 Windows 任务栏通知区域中的 WampServer 图标访问)
- 为 VM 防火墙创建“入站规则”以允许连接到端口 80
...谢天谢地,脚本运行成功!
理想情况下,我仍然希望将此作为 Azure 云服务运行,因为我不需要在完整的 VM 中维护 PHP 安装。
更新 2
我尝试重新启动云服务,然后远程连接到云服务的实例并查看应用程序事件查看器。我看到 WMI 在启动期间记录了 1 个错误:
带有查询“SELECT * FROM __InstanceModificationEvent WITHIN 60”的事件过滤器 在哪里 TargetInstance ISA“Win32_Processor”和 TargetInstance.LoadPercentage > 99“ 由于错误 0x80041003,无法在命名空间“//./root/CIMV2”中重新激活 在问题得到纠正之前,无法通过此过滤器传递事件。
然后我运行了几次上述脚本并重新检查了应用程序事件查看器,但没有记录任何内容。
我还检查了 IIS 日志和Azurelog和文件,但无济于事。startup-tasks-logstartup-tasks-error-log