现在的位置: 首页 > 综合 > 正文

PHP调用COM的实现(VC6)

2012年08月14日 ⁄ 综合 ⁄ 共 1656字 ⁄ 字号 评论关闭

项目中需要用DLL实现一些服务端的运算,故想到用COM来实现以下是在通过网上别人例子所做的总结:

  1. 在VC++ 6.0中,File -> New...  选择Projects中的"ATL COM AppWizard",填写工程名称等。本例中,工程名为"ATLtest"。
  2. 在"ATL COM AppWizard - Step 1 on 1"对话框中,"Server Type" 选择"Dynamic Link Library (DLL)",之后Finish。
  3. 在"ClassView"中,右击"ATLtest",选择"New ATL Object...",在"ATL Object Wizard"中,选择默认的"Simple Object",之后"Next"。
  4. 在"ATL Object Wizard 属性"中,在"Short Name"输入接口的名称。本例中,接口名称为"test"。之后,"Names"选项卡中的所有textBox都自动填好了默认的值。注意两个地方:一个"Prog ID"(本例中为"ATLtest.test"),一个"Interface"(本例中为"Itest")。
  5. 完成之后,在"ClassView"中,"ATLtest classes"下生成了"Ctest"类,并且实现了"Itest"接口。
  6. 右击"Itest"接口,选择"Add Method..."。
  7. 在"Add Method to Interface"中,填写方法的名称和参数。注意:返回值一定是HRESULT型,真正的返回值是最后一个参数。比如
    //C++ code
    BSTR Encode(unsigned int msgType, unsigned int msgLength, BSTR message)

    这个函数,要写成

    //C++ code
    STDMETHODIMP Ctest::Encode(
        unsigned int
    msgType,
        unsigned int
    msgLength,
        BSTR message,
        BSTR *result
    )

    这样的形式。还有就是返回值只接受简单的类型(不知道为什么,char**不能用)和指针,BSTR没法直接使用。

  8. 完成这个函数。当然,为了简单起见,这里就是给结果随便赋了一个值,用来说明参数成功的传递出来了。没有考虑任何内存泄漏问题。
    //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;
    }

  9. 编译,将得到的ATLtest.dll使用regsvr32进行注册,注册命令:regsvr32   ****.dll   卸载命令:regsvr32   ****.dll   /u/s  
  10. 之后书写这样的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;

  11. 注意这里的"ATLtest.test"是刚才(4)中的"Prog ID",并且使用Encode() 的方法和声明的也不一样。没有关系!
    当然,由于完全没有用到三个输入参数,这里的1,1,"11"只是为了满足输入参数的数量。
  12. 这个php的输出是什么样的呢?
    //HTML 结果
    $result = "未处理的字符串"
    $result = "asdfasdf";//我在这里试验没有成功,输出的是result="";但是函数确实已经执行,可能是由于php与ATL参数匹配的问题?我这里没有用到返回值,所以就先这样了,如果谁知道原因或解决办法,请不吝赐教啊

抱歉!评论已关闭.