您当前的位置: 首页 > 网站编程 > PHP教程 > PHP4中COM函数探讨

PHP4中COM函数探讨

作者:guanchaofeng 来源:不详 发布时间: 2009-10-29 14:58 点击:
介绍 内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档。本文将以三个例子分别处理MSoffice2000Word、Excel、AdobeDistiller来说明如何在PHP中使用COM函数。 COM技术是由Microsoft在几年前提出并开发

PHP4中COM函数探讨

  介绍
  
  内置于PHP4里的COM函数对于我们在win32环境下开发程序是相当有吸引力的,但是至今仍没有多少相关的技术文档。本文将以三个例子分别处理MSoffice2000Word、Excel、AdobeDistiller来说明如何在PHP中使用COM函数。
  
  COM技术是由Microsoft在几年前提出并开发的,本文中提到的相关名词有OLE,OLEAutomation,ActiveX,COM,这些词的意思都基本一样,都表示用一段封装的代码(对象)来完成一个windows应用程序的一些功能。PHP4COM函数可以连接一个对象实例,并使用它的方法与属性。
  
  如果你想使用下面的例子源码,请参考一下我的配置。
  
  Windows98-MSOffice2000
  Apache1.3.9Windows
  PHP4.02Dev(08-20-00)RunningasCGI
  
  PHP4中的COM标记
  
  现在让我们开始吧,用PHP4的COM来实例化一个组件,需要new操作符和对象的"OLE程序标识":
  
  $instance=newCOM("$identifier");
  
  ?>
  
  因为COM是一个PHP4的保留字,它传送这个对象的标识给一个构造函数,现在得到了这个组件的一个实例,根据OOP类的性质,我们可以很容易地访问它的方法与属性。
  
  例如:
  
  $instance->[Object]->[method1]->[method2]->..->[property];
  
  ?>
  
  就是这么简单!
  
  OOP的结构在PHP下不能工作,(由于PHP语法的问题,属性的名字.值是非法字符,如点和圆括号等),所以PHP4提供了两个相应的函数:
  
  boolcom_set(classcom_object,stringpropertyname,stringproperty_value);
  
  mixedcom_get(classcom_object,stringproperty_name);
  
  ?>
  
  最后,PHP4也支持DCOM技术,可以在远程计算机创建一个对象实例。
  
  $Instance=newCOM(string"Componentname",string"remote_server_address");
  
  ?>
  
  注意:这是用DCOM指令来设置PHP。在将来,PHP开发者提供Unix下对DCOM的支持。
  
  标识、方法和属性
  
  标识是一个如下的字串:
  
  MSWord:"Word.Application"or"Word.Application.9"
  MSExcel:"Excel.Application"or"Excel.Sheet"
  ADOBEAcrobat:"Exch.application"or"PdfDistiller.PdfDistiller"
  
  对于最后一个标识,我要指明的是,获得正确的对象标识名不是一件容易的事。如果你不能访问VBA文档,你可以查找一下windows的注册表,在HKEY_CLASSES_ROOT中寻找一下,你就可以得到一些应用程序的名字。在你的机器上有效的对象标识放在CLSID子文件夹下。
  
  应用程序一般会提供文档说明它的COM方法和属性。在office2000中,你可以运行程序,打开VBA编辑器,选择对象编辑器。输入应用程序库中的一个方法名或属性名,然后,在下面的窗口中用鼠标右键选择一个类或成员名称,点帮助,你就会得到关于这个类或成员的描述。你也可以参考MSDN。一个Excel的例子如下:http://msdn.microsoft.com/library/officedev/off2000/xltocobjectmodelapplication.htm
  
  
  用COM函数操作MSWord
  
  现在,我们开始第一个例子吧:
  
  #*********************************************************
  #本例来自Zend站点,略有改动
  #打开一个word实例,并新建一个文档Uselesstest.doc
  #输入一行文字"Thisisatest2..."
  #*********************************************************
  
  #实例化一个对象
  
  $word=newCOM("word.application")ordie("UnabletoinstantiateWord");
  
  #取得并显示版本
  
  print"LoadedWord,version{$word->Version}
  ";
  
  #另一种方法去取得版本
  
  $testversion=com_get($word->application,version);
  
  print"VersionusingCom_get():$testversion
  ";
  
  #使其可见
  
  $word->Visible=1;
  
  #创建新文件
  
  $word->Documents->Add();
  
  #写字符
  
  $word->Selection->TypeText("Thisisatest...");
  
  #保存
  
  $word->Documents[1]->SaveAs("Uselesstest.doc");
  
  #关闭
  
  $word->Quit();
  
  ?>
  
  你只要花几分钟来读这个程序,并参考Word的OLE技术文档,你将学到几乎是你在自己程序中所需的全部的操作。
  
  MSExcel在使用PHP的COM函数
  
  如同上面的Word的例子一样,你应学习这个例子的同时参考Excel的VisualBasic编辑器中的对象浏览器的帮助文档。
  
  #打开workbook和它的sheet,
  #本例使用一个电子表格是Excel安装时自带的SOLVSAMP.XLS
  
  $workbook="C:ProgramFilesMicrosoftofficeOfficeSamplesSOLVSAMP.XLS";
  $sheet="QuickTour";
  
  #实例化一个组件的对象
  $ex=newCOM("Excel.sheet")orDie("Didnotconnect");
  
  #取程序名称和版本
  print"Applicationname:{$ex->Application->value}
  ";
  print"Loadedversion:{$ex->Application->version}
  ";
  
  #打开工作本使我们可使用它
  $wkb=$ex->application->Workbooks->Open($workbook)orDie("Didnotopen");
  
  #预保存原来的工作本,创建一个工作本的复本
  $ex->Application->ActiveWorkbook->SaveAs("Ourtest");
  #$ex->Application->Visible=1;#本句去注释让Excel可见
  
  #读写一个单元格在一个新的工作表中
  #我们可以读到这个单元格E11(Advertisinginthe4th.Quarter)
  $sheets=$wkb->Worksheets($sheet);#Selectthesheet
  $sheets->activate;#Activateit
  $cell=$sheets->Cells(11,5);#Selectthecell(RowColumnnumber)
  $cell->activate;#Activatethecell
  print"OldValue={$cell->value}
  ";#Printthevalueofthecell:10000
  $cell->value=15000;#Changeitto15000
  print"Newvalue={$cell->value}
  ";#Printthenewvalue=15000
  
  #最后,用新值重新计算这个单元格
  $sheets->Calculate;
  #必须的如果要计算,手动则是可选的
  #可看到效果总价值(E13单元格)
  $cell=$sheets->Cells(13,5);#Selectthecell(RowColumnnumber)
  $number=Number_format($cell->value);
  print"NewTotalcost=$$number-was$47,732before.
  ";
  #根据计算公式,广告影响了公司的开销,这里将显示$57,809
  
  #使用Excel内建的函数
  #PMT(percent/12months,Numberofpayments,Loanamount)
  $pay=$ex->application->pmt(0.08/12,10,10000);
  $pay=sprintf("%.2f",$pay);
  print"Monthlypaymentfor$10,000loan@8%interest/10months:$$pay
  ";
  
  #Shouldprintmonthlypayment=$-1,037.03
  
  #可选,保存
  $ex->Application->ActiveWorkbook->SaveAs("Ourtest");
  #关闭,不提问
  $ex->application->ActiveWorkbook->Close("False");
  unset($ex);
  
  ?>
  
  这个例子让你的PHP与Excel一同工作了,当然,也有更多的对象可以使用,访问一个自已写的OOP封装类也与访问excel一样容易。
  
  用PHP的COM访问AdobeDistiller
  
  这最后一个例子不是MS程序了,如果你的程序有一个PostScript文件,你会对这个有兴趣的,改写(蒸馏)它成为一个PDF文档.Adobe有一个程序叫Distiller,它可以生成一个实例。代码如下:
  
  $pdf=newCOM("pdfdistiller.pdfdistiller.1");
  
  ?>
  
  有一点要注意的,是在Distiller的文档中给出的这个OLE标识名"pdfdistiller"是无效的。
  
  蒸馏一个文件的最基本的方法是:
  
  $pdf->FileToPdf($psfile,strOutputPDF朙朙,strJobOptions"");
  
  ?>
  
  这$psfile是这个PostScript的文件名,strOutputPDF是输出文件PDF的文件名。StrJobOptions是Distiller的参数文件名,最后两个参数是可选的,默认是同一名字。这PS文件名与PDF文件名,使用这个默认的Joboptions文件。例如:
  
  $pdf->FileToPdf($psfile,"","");
  #这儿$psfile可以是Myfile.ps将返回Myfile.pdf文件。
  
  ?>
  
  在Distiller中有更多的方法和属性能被用。如果你感兴趣,请参考一下Adobe的技术文档。
  
  中止/可能的问题
  
  如果你的代码中发生了什么错误,你可能会创建了一个实例,但没有正常地关闭它。最糟的是,这个应用程序可能被这个实例所保持,结果,在你的程序列表中就存在多份这个程序的副本,即使你更正了这个错误也会干扰你的结果。解决方法是:修正一个bug以来要及时清除它们在你重新开始运行之前,用并结束任务。同样的原因,在你的代码最后,也要及时关闭这个程序并删除这个实例。
  
  你有一些技巧在处理com_get和com_set的异常时。例如:
  
  $Version=Com_get($instance->Application,"Version");
  
  将会在Word中工作但在Excel中会产生一个错误。
  
  有一些对象在PHP4中是不能实例化的,这是因为这个程序要一个自定义的接口,但PHP4不支持。
  
  为什么我们要用它?
  
  我希望这三个例子可以给你一些思考的线索,PHP的COM允许你在PHP的脚本中访问windows4的程序。这个代码比ASP简单并且能集成其它的PHP对数据库强大的支持功能。Microsoft在各个方面都大力销售这个COM技术,在不同的名称和结构下,如COM+(CombineCOMwithMicrosoftTransactionServerMTS),ADO,OLEDB,OWC,WindowsDNA,等等。PHP和Apache的结合,提供了一个开放源码的解决方案。

分享到:
本文"PHP4中COM函数探讨"由远航站长收集整理而来,仅供大家学习与参考使用。更多网站制作教程尽在远航站长站。
顶一下
(0)
0%
踩一下
(0)
0%
[点击 次] [返回上一页] [打印]
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
关于本站 - 联系我们 - 网站声明 - 友情连接- 网站地图 - 站点地图 - 返回顶部
Copyright © 2007-2013 www.yhzhan.com(远航站长). All Rights Reserved .
远航站长:为中小站长提供最佳的学习与交流平台,提供网页制作与网站编程等各类网站制作教程.
官方QQ:445490277 网站群:26680406 网站备案号:豫ICP备07500620号-4