PHP调用COM的实现(VC6)
项目中需要用DLL实现一些服务端的运算,故想到用COM来实现以下是在通过网上别人例子所做的总结:
- 在VC++ 6.0中,File -> New... 选择Projects中的"ATL COM AppWizard",填写工程名称等。本例中,工程名为"ATLtest"。
- 在"ATL COM AppWizard - Step 1 on 1"对话框中,"Server Type" 选择"Dynamic Link Library (DLL)",之后Finish。
- 在"ClassView"中,右击"ATLtest",选择"New ATL Object...",在"ATL Object Wizard"中,选择默认的"Simple Object",之后"Next"。
- 在"ATL Object Wizard 属性"中,在"Short Name"输入接口的名称。本例中,接口名称为"test"。之后,"Names"选项卡中的所有textBox都自动填好了默认的值。注意两个地方:一个"Prog ID"(本例中为"ATLtest.test"),一个"Interface"(本例中为"Itest")。
- 完成之后,在"ClassView"中,"ATLtest classes"下生成了"Ctest"类,并且实现了"Itest"接口。
- 右击"Itest"接口,选择"Add Method..."。
- 在"Add Method to Interface"中,填写方法的名称和参数。注意:返回值一定是HRESULT型,真正的返回值是最后一个参数。比如
//C++ code
BSTR Encode( unsigned int msgType, unsigned int msgLength, [out, retval] BSTR message)
这个函数,要写成
//C++ code
STDMETHODIMP Ctest::Encode(
unsigned int msgType,
unsigned int msgLength,
BSTR message,
BSTR *result
)
这样的形式。还有就是返回值只接受简单的类型(不知道为什么,char**不能用)和指针,BSTR没法直接使用。 - 完成这个函数。当然,为了简单起见,这里就是给结果随便赋了一个值,用来说明参数成功的传递出来了。没有考虑任何内存泄漏问题。
//C++ code
STDMETHODIMP Ctest::Encode(
unsigned int msgType,
unsigned int msgLength,
BSTR message,
BSTR *result
)
{
BSTR temp = :: SysAllocString(L" asdfasdf");
*result = temp;
return S_OK;
} - 编译,将得到的ATLtest.dll使用regsvr32进行注册,注册命令:regsvr32 ****.dll 卸载命令:regsvr32 ****.dll /u/s
- 之后书写这样的php代码:
//php code
$com = new COM( "ATLtest.test") or die( "无法建立COM组件");
$result = " 未处理的字符串";
echo '$result = "'.$result. '"<br />';
$result = $com->Encode(1,1," 11");
echo '$result = "'.$result. '"<br />';
$com = null; - 注意这里的"ATLtest.test"是刚才(4)中的"Prog ID",并且使用Encode() 的方法和声明的也不一样。没有关系!
当然,由于完全没有用到三个输入参数,这里的1,1,"11"只是为了满足输入参数的数量。 - 这个php的输出是什么样的呢?
//HTML 结果
$result = "未处理的字符串"
$result = "asdfasdf";//我在这里试验没有成功,输出的是result="";但是函数确实已经执行,可能是由于php与ATL参数匹配的问题?我这里没有用到返回值,所以就先这样了,如果谁知道原因或解决办法,请不吝赐教啊