在《PHP调用COM组件的说明》里,已介绍了PHP调用COM组件的方法。如果能用COM调用DLL,再用PHP调用COM,就可以实现PHP对DLL的调用。即以COM作为中间件,让PHP可以调用现成的DLL,可以很大程度上地减少PHP开发的工作量。
下面将对COM调用DLL的方法进行说明。采用的是msvs.net2005环境下的C#语言。
1.建立DLL
建立类库生成DLL的方法不再说明。需要注意的是如果COM组件具有强命名,一定要也赋予类库强命名,才可以被COM调用;如果COM不具强命名,类库也无需强命名。强命名方法如下:
在“开始—VS2005 —VS Tools—VS命令提示符”,输入:
sn -k ****_Key.snk
将****_Key.snk 添加入项目中(在Program Files\MS Visual Studio 2005\VC下),然后打开AssemblyInfo.cs,并加入下面一行的内容:
[assembly: AssemblyKeyFile("****_Key.snk")]
下面为代码示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace PHPInvokeClassLibrary
{
public class PhpClass
{
public string Php_func(string a,string b)
{
string c = a + b;
return c;
}
}
}
2.在COM中调用DLL
在COM中类的所有方法都要在类接口中先定义。所以我们要先在类接口中定义一个方法,并赋予其Dispid值,然后在继承的类中实现这个方法,在方法中我们就可以调用我们想要的DLL。COM代码示例如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Data.OleDb;
using System.Data;
using System.Collections;
using System.Collections.Specialized;
using PHPInvokeClassLibrary;
namespace Comtest
{
//类接口
[Guid("394BE3FE-18B8-4c5e-B611-75B5C5493A4E")]
public interface ITest
{
[DispId(1)]
string Test(string test);
[DispId(2)] //固定写法,索引号从1开始
string About();
[DispId(3)]
int Add(int a, int b);
//该方法用于调用DLL
[DispId(4)]
string PhpFunc();
}
//事件接口
[Guid("45875EE5-5C8D-4016-897A-FCC7DD5A6834"), //固定写法
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface ITest_Events
{
}
//类
[Guid("854C2016-E7BF-41ea-8F09-B873698E9F8E"), //固定写法
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(ITest_Events))]
public class Class2 : ITest //该类继承上面的接口,并实现抽象方法
{
public string Test(string test)
{
return test;
}
public string About() { return "欢迎访问 http://www.35.com"; }
public int Add(int a, int b) { return a + b; }
//该方法实现了类接口Dispid(4)的方法,调用了DLL
public string PhpFunc()
{
PhpClass a = new PhpClass();
string b = a.Php_func("Ha","what?");
return b;
}
}
}
3.PHP调用COM
那么只要在PHP中使用COM类就可以成功调用DLL中我们想要的方法了!代码如下:
<?php
//dl("comtest.dll");
//w32api_register_function("", "FuncDll", "int");
$b=new COM("Comtest.Class2");
$t1=126;
$t2=456;
$r=$b->add($t1,$t2);
$f=$b->about();
//这个动作就在调用DLL了
$z=$b->PhpFunc();
echo $r;
echo $f;
echo $z;
?>