InfoQ

交流

讨论:大家来研究一下com吧

作者 dong 发布于 2003-09-02 分类:php基础编程

简介
  PHP4内置的COM函数对于在win32环境下编程的人们确实有吸引力。目前关于这方面的文档并不多。这篇文章将用3个例子(MS office 2000, Excel, Adobe Distiller)来解释怎样在PHP4里用COM编程。微软用不同的名称开发COM技术已经有多年了。在这篇文章里OLE, OLE自动化, ActiveX和COM都是一回事:用一段封装的代码来为一个windows应用实现一些函数。PHP4的COM建立与对象的连接(实例化对象)然后用其中的方法和属性。
  如果你想重新开发这些例子,以下是我的配置:
Windows 98 - MS Office 2000
Apache 1.3.9 Windows
PHP4.02 Dev (08-20-00) Running as CGI



PHP4里的COM标记
  让我们从PHP4里的COM函数开始。要实例化一个控件,需要一个“new”操作符和对象的“OLE标识符”:
<?php $instance = new COM("$identifier"); ?>
  COM是PHP4保留的一个类名称,它把$identifier传给构造函数。 我们现在有了一个实例化的控件,可以用OOP技术很方便的引用它的方法和属性。例如:
<?php $instance->[Object]->[method1]->[method2]->..->[property]; ?>
就是这么简单!
  如果不能这样引用的话(有时当属性的名称或值中含有点或括号等特殊字符时会引起PHP语法错误),PHP4 COM还提供了两个函数:
<?php
bool com_set(class com_object, string property name, string property_value);
mixed com_get(class com_object, string property_name);
?>
  最后,PHP4也支持DCOM,可以建立一个远程计算机上对象的实例。
<?php
$Instance = new COM(string "Component name", string "remote_server_address");
?>
  以上就是所有的函数,没有其它函数需要记住了!
  注意:PHP可能将来支持在Unix上使用DCOM。



标识符,方法和属性
标识符是类似下面的字符串:
MS Word: "Word.Application" 或 "Word.Application.9"
MS Excel: "Excel.Application" 或 "Excel.Sheet"
ADOBE Acrobat: "Exch.application" 或 "PdfDistiller.PdfDistiller"
  就象最后一个标识符表明的,并不是所有的对象的名称都是显而易见的。如果你没有VBA的文档,你可以查看注册表的HKEY_CLASSES_ROOT文件夹:在扩展名列表的下面你可以看到应用程序的名称,有CLSID子文件夹的就是可用的COM标识符。
  应用程序应该提供有关COM的方法和属性的文档。例如在Office 2000中,打开程序,用快捷键打开VB编辑器然后用打开对象编辑器。输入一个方法或属性的名称,选择一个成员后选择帮助即可得到该成员的描述。你也可以访问MSDN。一个Excel的例子是:
http://msdn.microsoft.com/librar ... odelapplication.htm



逛论坛交流大家来研究一下com吧

加入书签
digg+,
reddit+,
del.icio.us+,
dzone+

5 条回复

回复

本文介绍的函数只能在windows下的PHP中.. 发表人 dong 发表于 09月26日
php生成excel文档太简单了,估计大家都.. 发表人 dong 发表于 09月26日
PHP4中使用COM (Windows)--例子 -.. 发表人 dong 发表于 09月26日
靠! 这么好的帖子,要不是找东西,还.. 发表人 barryonline 发表于 01月26日
一年以前的啊 看看再说 发表人 cime63 发表于 01月26日
  1. 返回顶部

    Re: 大家来研究一下com吧

    2003年09月26日 发表人 dong

    本文介绍的函数只能在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。

  2. 返回顶部

    Re: 大家来研究一下com吧

    2003年09月26日 发表人 dong

    php生成excel文档太简单了,估计大家都会用到,所以共享出来。
      大家来看代码:
    <?
    header("Content-type:application/vnd.ms-excel");
    header("Content-Disposition:filename=test.xls");
    echo "test1 ";
    echo "test2 ";
    echo "test1 ";
    echo "test2 ";
    echo "test1 ";
    echo "test2 ";
    echo "test1 ";
    echo "test2 ";
    echo "test1 ";
    echo "test2 ";
    echo "test1 ";
    echo "test2 ";
    ?>
      在php环境运行上面的代码,大家就可以看到浏览器询问用户是否下载excel文档,点击保存,硬盘上就多了一个excel的文件,使用excel打开就会看到最终的结果,怎么样不错吧。
      其实在做真正的应用的时候,大家可以将数据从数据库中取出,然后按照每一列数据结束后加 ,每一行数据结束后加 的方法echo出来,在php的开头用header("Content-type:application/vnd.ms-excel");表示输出的是excel文件,用header("Content-Disposition:filename=test.xls");表示输出的文件名为text.xls。这样就ok了。



      我们更可以修改header让他输出更多格式的文件,这样php在处理各种类型文件方面就更加方便了.

  3. 返回顶部

    Re: 大家来研究一下com吧

    2003年09月26日 发表人 dong

    PHP4中使用COM (Windows)--例子 -------------------------------------------------------------------------------- 源作者:追风 人气:3108 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}
    "; #用com_get取得版本号 $testversion = com_get($word->application,version); print "用Com_get()取得的版本: $testversion
    "; #让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 = "Crogram FilesMicrosoft officeOfficeSamplesSOLVSAMP.XLS"; $sheet = "Quick Tour"; #实例化工作表控件 $ex = new COM("Excel.sheet") or Die ("Did not connect"); #取得程序名称和版本 print "程序名称:{$ex->Application->value}
    " ; print "版本:{$ex->Application->version}
    "; #打开工作簿 $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}
    "; #打印内容:10000 $cell->value = 15000; #改为15000 print "New value = {$cell->value}
    "; #打印新内容: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.
    "; #将会打印$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
    "; #将会打印monthly payment = $ -1,037.03 #保存改过的工作簿 $ex->Application->ActiveWorkbook->SaveAs("Ourtest"); #关闭所有工作簿 $ex->application->ActiveWorkbook->Close("False"); unset ($ex); ?> 警告/可能的问题   如果你的代码中有错误,你就有可能实例化了一个对象而没有关闭。结果当你改正了错误后有可能已经存在几个实例了,也许会干扰你的结果。解决:当改正了代码的错误之后,清除(后结束任务)所有的实例再运行新代码。同样的道理,记住在代码的末尾关闭程序断开联接。   当使用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不是很熟所以没有翻译。

  4. 返回顶部

    Re: 大家来研究一下com吧

    2005年01月26日 发表人 barryonline

    靠!
    这么好的帖子,要不是找东西,还真翻不出来。
    定出来,大家一起看

  5. 返回顶部

    Re: 大家来研究一下com吧

    2005年01月26日 发表人 cime63

    一年以前的啊
    看看再说




  6. 我有话要讲:(可以匿名发表, 发广告的有多远请滚多远!!!)

    昵称: 请输入验证码:


抢着回答

如何关闭所有打开的文本文件?

小弟对多个文本进行操作,最终操作完成后要关闭这些文件,但要再...

 孙悟空职称评定内幕  zt

  孙悟空职称评定内幕  ZT   (一)   唐僧...

中秋节快乐。

请笑纳。。。。。 晕,农村是算农历过生日的,偶刚刚满22岁...

如何运行zend加密的php文件?我已装zen...

我装好了zend了,也加密了一个php文件,但现在这个php无法运行起...

请教:如何用 Insert ...select 语句插...

请教:如何用 INSERT ...SELECT 语句插入别一个表中的值??如:...

悟典apache 遇装不轱犭

我系统重新装了,装完APACHE后右下角老是显示停止状态,安装过程...

蒋宋美龄纽约过世 享年106岁

蒋夫人宋美龄女士今天病逝纽约寓所,享年106岁。这位一生从19世纪...

服务商禁止了ksort(), each() 函数,如...

我的程序出现错误如下: Warning: ksort() expects parameter...

村里有人在玛?

在的来聊天啊。

想知道moon样子的近来。。。。

谁能告诉一下。。。我很好奇。。。

[]