搞完了PHP4调用JavaBean,又想去试试调用COM,开始以为很难,自己用VB6写了 
一个Active Dll在PHP4中调用,马上成功,比调用javabean方便多了,下面讲一 
下我的步骤。 下载的版本是从http://www.mm4.de/。 一:用VB6写Activex Dll 代码如下: Option Explicit  Private MyScriptingContext As ScriptingContext  Private MyApplication As Application  Private MyRequest As Request Private MyResponse As Response  Private MyServer As Server  Private MySession As Session Public  Sub OnStartPage(PassedScriptingContext As ScriptingContext)  Set MyScriptingContext = PassedScriptingContext  Set MyApplication = MyScriptingContext.Application  Set MyRequest = MyScriptingContext.Request  Set MyResponse = MyScriptingContext.Response  Set MyServer = MyScriptingContext.Server  Set MySession = MyScriptingContext.Session  End Sub  Public Sub OnEndPage()  Set MyScriptingContext = Nothing Set MyApplication = Nothing  Set MyRequest = Nothing  Set MyResponse = Nothing  Set MyServer = Nothing  Set MySession = Nothing  End Sub  Public Function Test_Number(num) As Variant  If num < 0 Then Get_Number_Attrib = -1  If num > 0 Then Get_Number_Attrib = 1  If num = 0 Then Get_Number_Attrib = 0 End Function  具体方法如下:新建一个VB6工程,ActiveX Dll将工程命名为P_test,类名为c_t 
est 类的文件内容如上。 编译生成p_test.dll文件 二:注册 提示符下运行:regsvr32 p_test.dll 三:编写php文件,test.php4代码如下: <? $b=new COM("p_test.c_test"); $a=$b->Test_Number(-454); echo $a; ?> 运行php4文件将显示-1 可能遇到的问题是,编译工程时通不过,要将 Microsoft Active Server Pages Object Library  引用进来,具体实现“Project->References”找到改库,并勾上 相比之下,PHP4调用com应该比PHP4调用javabean好哦,因为毕竟是Ms系统嘛。大 
家也可以去自己编写调用数据库的控件,用PHP4调用,从某种程度上,和PHP调用 
javabean一样,可以说,实现了“隐藏源代码”。 欢迎有兴趣的朋友交流。 (转载请注明作者和主页地址)  ... ... 
(哈哈,jackyz酷哥就坐在我前面,非常的酷----我是指3角洲)

解决方案 »

  1.   

    PHP4 COM的MS Word例子
    <?php
    #*****************************************************
    # 这个例子来自Zend站点,并做了一点修改。
    # 将会打开一个Word的实例,
    # 输入一行“This is a test...”
    # 存为“Useless test.doc”。
    #*****************************************************
    #实例化一个Word控件
    $word = new COM("word.application") or die("不能实例化Word");
    #取得并输出版本号
    print "载入Word, 版本 {$word->Version}<BR>";
    #用com_get取得版本号
    $testversion = com_get($word->application,version);
    print "用Com_get()取得的版本: $testversion <BR>";
    #让Word可见
    $word->Visible = 1;
    #打开一个新文档
    $word->Documents->Add();
    #写
    $word->Selection->TypeText("This is a test...");
    #存
    $word->Documents[1]->SaveAs("Useless test.doc");
    #手工关闭Word,如果你想看到文档则注释下面这行
    $word->Quit();
    ?>PHP4 COM的MS Excel例子
    <?php
    #设置工作簿,
    #在这里我们用Excel安装时自带的:SOLVSAMP.XLS
    $workbook = "C:Program FilesMicrosoft officeOfficeSamplesSOLVSAMP.XLS";
    $sheet = "Quick Tour";#实例化工作表控件
    $ex = new COM("Excel.sheet") or Die ("Did not connect");#取得程序名称和版本
    print "程序名称:{$ex->Application->value}<BR>" ;
    print "版本:{$ex->Application->version}<BR>";#打开工作簿
    $wkb = $ex->application->Workbooks->Open($workbook) or Die ("Did not open");#另存一份,这样就不会破坏原来的文件了
    $ex->Application->ActiveWorkbook->SaveAs("Ourtest");
    #$ex->Application->Visible = 1; #去掉注释可以让Excel可见#读取一个单元格的内容(E11)
    $sheets = $wkb->Worksheets($sheet); #选择工作表
    $sheets->activate; #激活
    $cell = $sheets->Cells(11,5) ; #选择单元格(行列号)
    $cell->activate; #激活
    print "Old Value = {$cell->value} <BR>"; #打印内容:10000
    $cell->value = 15000; #改为15000
    print "New value = {$cell->value}<BR> "; #打印新内容:15000#最后,重新计算工作表
    $sheets->Calculate; #当计算选项是手工时需要
    #看看结果total cost(单元格E13)
    $cell = $sheets->Cells(13,5) ; #选择单元格
    $number = Number_format($cell->value);
    print "New Total cost =$$number - was $47,732 before.<BR>";
    #将会打印$57,809#使用Excel的内置函数:
    #Function: PMT(percent/12 months,Number of payments,Loan amount)
    $pay = $ex->application->pmt(0.08/12,10,10000);
    $pay = sprintf("%.2f",$pay);
    print "Monthly payment for $10,000 loan @8% interest /10 months: $ $pay<BR>";
    #将会打印monthly payment = $ -1,037.03#保存改过的工作簿
    $ex->Application->ActiveWorkbook->SaveAs("Ourtest");
    #关闭所有工作簿
    $ex->application->ActiveWorkbook->Close("False");
    unset ($ex);
    ?>警告/可能的问题
      如果你的代码中有错误,你就有可能实例化了一个对象而没有关闭。结果当你改正了错误后有可能已经存在几个实例了,也许会干扰你的结果。解决:当改正了代码的错误之后,清除(<CTRL+ALT+DEL>后结束任务)所有的实例再运行新代码。同样的道理,记住在代码的末尾关闭程序断开联接。
      当使用com_get和com_set时你可能会遇到一些奇怪的现象。例如:为Word使用$Version = Com_get($instance->Application,"Version");时产生一个Excel的错误。
    有些对象不能在PHP4中实例化,这是因为这些对象需要一个PHP4 COM不支持的接口。为什么用它?
      希望这几个例子能给你一些启发。PHP COM允许你在PHP代码里连接许多Windows程序。这些代码比ASP更容易并且可以和PHP的数据库函数集成在一起使用。微软使用了一些不同的名称到处推广COM技术,例如COM+, ADO, OLE DB, OWC, Windows DNA等等。PHP和Apache给这些混淆提供了一个开放的解决方案。
      原文有三个例子,最后一个因为自己对PDF不是很熟所以没有翻译。
      

  2.   

    本文介绍的函数只能在windows下的PHP中使用。
    函数列表:
    com_load — 创建一个COM组件的引用。
    com_invoke — 调用一个COM组件的方法。
    com_propget — 取一个COM组件的属性的值。
    com_get — 同上,取一个COM组件的属性的值。
    com_propput — 赋一个值给一个COM组件的属性。
    com_propset — 同上,赋一个值给一个COM组件的属性。
    com_set — 同上,赋一个值给一个COM组件的属性。
    在www.php.net 下给出了如下实例:
    例1:
    <?
    $word=new COM("word.application") or die("Cannot start word for you");
    print "Loaded word version ($word->Version)n";
    $word->visible =1 ;
    $word->Documents->Add();
    $word->Selection->Typetext("Dit is een test");
    $word->Documents[1]->SaveAs("burb ofzo.doc");
    $word->Quit();
    ?>
    例2:
    另外,有人给出了另一个例子,用 Delphi做了一个对象 MyObject (一个方法 ComTophp)。
    也可以这样用:
    $Obj = com_load("MyLibraryTest.MyObject");
    $result = com_invoke($Obj,"ComTophp","Params 1","Params 2");
    echo $result;
    上面这个例子我可没试过哦。
    例3:
    <?
    # example use of ADODB and SQLOLEDB (MS-SQL 7) in PHP 4
    # Tested on Win2K with PHP 4.02
    $conn_obj = new COM("ADODB.Connection") or die("Cannot start ADO");
    // replace myserver with your server name
    define ("OLEDB_CONNECTION_STRING", "Provider=SQLOLEDB; Data Source=myserver; Initial Catalog=Northwind; User ID=sa; Password=");
    // use SQL Server 7.0 OLE DB Provider
    $conn_obj->Open(OLEDB_CONNECTION_STRING);
    $command = "select lastname, firstname, title from employees"; // SQL Statement
    $rs = $conn_obj->Execute($command); // Recordset
    $i = 0;
    $fld0 = $rs->Fields(0);
    $fld1 = $rs->Fields(1);
    $fld2 = $rs->Fields(2);
    while (!$rs->EOF) {
    $i += 1;
    print "$fld0->value $fld1->value $fld2->value
    ";
    $rs->MoveNext();
    }
    $rs->Close();
    ?>
    好了,下面就逐个介绍吧。
    //******************
    com_load
    (PHP3.0.3 - 3.0.16 only)
    string com_load (string module name [, string server name])
    创建一个COM组件新的引用,并返回它,如果失败,返回 false 。
    参数分别是模块名和服务器名。
    //********************
    com_invoke
    (PHP3.0.3 - 3.0.16 only, PHP4 )
    mixed com_invoke (resource com_object, string function_name [, mixed function parameters, ...])
    调用一个COM组件的方法。如果成功,返回function_name的返回值,否则,返回false。
    参数分别是:模块引用,方法名,方法所需的参数,
    //*************************
    com_propget
    (PHP3.0.3 - 3.0.16 only, PHP4 )
    mixed com_propget (resource com_object, string property)
    取COM组件的一个属性的值,本函数是 com_get() 的一个别名。
    //*************************
    com_get
    (PHP3.0.3 - 3.0.16 only, PHP4 )
    mixed com_get (resource com_object, string property)
    参数分别是:COM引用,属性名。
    如果错误,返回 false。
    //***************************
    com_propput
    (PHP 3.0.3 - 3.0.16 only, PHP4 )
    void com_propput (resource com_object, string property, mixed value)
    给COM组件的一个属性付值。本函数是 com_set() 的一个别名。
    //****************************
    com_propset
    (PHP3.0.3 - 3.0.16 only, PHP4 )
    void com_propset (resource com_object, string property, mixed value)
    这也是com_set()的一个别名。
    //****************************
    com_set
    (PHP3.0.3 - 3.0.16 only, PHP4 )
    void com_set (resource com_object, string property, mixed value)
    给COM组件的一个属性赋值,参数是:组件模块名,属性名,新值。如果错误,返回false,否则返回 true。