设为首页 收藏本站
查看: 940|回复: 0

[经验分享] PHP调用COM组件的说明

[复制链接]

尚未签到

发表于 2015-8-23 08:27:42 | 显示全部楼层 |阅读模式
  在PHP 4.2.0 至 4.2.3中,可以使用w32api_register_function 函数调用外部的DLL,前提是需要在php.ini中打开扩展的php_w32api.dll。
  如果使用的是PHP 5,调用DLL只有使用PHP的COM类了。
  基本方法为:$obj = new COM("server.object")
  下面介绍如何用PHP调用COM组件,采用的是msvs.net2005环境下的C#建立COM组件。
  1. 用C#创建COM对象
  COM对象是ClassLibrary类,它生成DLL文件。要在VS开发环境中创建一个简单的COM对象,我们可以依次选择“文件”->“新建”->“项目”->“Visual C#”->“类库”,然后创建一个名字为Comtest的工程。
  需要注意的是:在COM中调用VC#对象需要下面的条件:
  ·类必须是public性质。
  ·特性、方法和事件必须是public性质的。
  ·特性和方法必须在类接口中定义。
  ·事件必须在事件接口中定义。
  不是在这些接口中定义的public性质的类成员不能被COM访问,但它们可以被其他的.NET Framework对象访问。要让COM能够访问特性和方法,我们必须在类接口中定义它们,使它们具有DispId属性,并在类中实现这些特性和方法。这些成员定义时的顺序也就是它们在COM中顺序。要让COM访问类中的事件,必须在事件接口中定义这些事件,并赋予它们DispId属性。
  在接口名字之前,每个接口需要一个GUID特性。要生成唯一的Guid,需要运行guidgen.exe工具软件,并选择“registry format”。在Program Files\Microsoft Visual Studio 2005\Common7\Tools\guidgen.exe可获得。
  需要注意的是,在类的前面,需要设置下面的特性:
  ClassInterface(ClassInterfaceType.None),
  ComSourceInterfaces(typeof(*** _Events))
  ClassInterfaceType.None表示没有为该类生成类接口,如果没有明确地实现接口,类只能通过IDispatch提供后期绑定访问。用户希望通过明确地由类实现的接口使外部对象能够访问类的功能,这也是推荐的ClassInterfaceAttribute的设置。
  ComSourceInterfaces(typeof(*** _Events))确定许多作为COM事件向外部对象提供的接口。
  下面是代码示例:
  using System;
  using System.Collections.Generic;
  using System.Text;
  using System.Runtime.InteropServices;
  using System.Reflection;
  using System.Data.OleDb;
  using System.Data;
  using System.Collections;
  using System.Collections.Specialized;
  namespace Comtest
  {
  //类接口
  [Guid("394BE3FE-18B8-4c5e-B611-75B5C5493A4E")]
  public interface ITest
  {
  string Test(string test);
  [DispId(1)]       //固定写法,索引号从1开始
  string About();
  [DispId(2)]
  int Add(int a, int b);
  }
  
  //事件接口
  [Guid("45875EE5-5C8D-4016-897A-FCC7DD5A6834"),             //固定写法
  InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
  public interface ITest_Events
  {
  }
  
  //类
  [Guid("854C2016-E7BF-41ea-8F09-B873698E9F8E"),           //固定写法
  ClassInterface(ClassInterfaceType.None),
  ComSourceInterfaces(typeof(ITest_Events))]
  public class Class2 : ITest          //该类继承上面的接口,并实现抽象方法
  {
  public string Test(string test)
  {
  return test;
  }
  
  public string About() { return "欢迎访问 http://www.35.com"; }
  public int Add(int a, int b) { return a + b; }
  }
  
  }
  
  在创建COM对象前,我们必须向COM Interop注册该对象。右击方案管理器中的工程名字,点击快捷菜单上的“属性”选项,然后再点击“生成”选项,将“为COM Interop注册”钩上。打开AssemblyInfo.cs将comVisible设为true。
  为了对程序集进行唯一的标识,安全策略和版本策略,可以为类库组合建立一个强名字。注意:不是必须。创建强名字需要用到SN.EXE名字,在“开始—VS2005 —VS Tools—VS命令提示符”,输入:
  sn -k Comtest_Key.snk
  将Comtest_Key.snk 添加入项目中(在Program Files\MS Visual Studio 2005\VC下),然后打开AssemblyInfo.cs,并加入下面一行的内容:
  [assembly: AssemblyKeyFile("Comtest_Key.snk")]
  最后生成项目,即可在bin下获得COM组件。
  2. PHP调用COM组件
  直接在PHP中使用COM类进行访问,即可。
  代码如下:
  <?php
  $b=new COM("Comtest.Class2");
  $t1=126;
  $t2=456;  
  $r=$b->add($t1,$t2);
  $f=$b->about();
  echo  $r;   
  echo $f;
  ?>   
  除此之外,调用访问EXCEL、WORD和数据库,都可以使用COM类。
  以下为调用WORD的简单例子:
  <?php
  // 启动 word
  $word = new COM("word.application") or die("Unable to instanciate Word");
  print "Loaded Word, version {$word->Version}\n";
  
  //将其置前
  $word->Visible = 1;
  
  //打开一个空文档
  $word->Documents->Add();
  
  //随便做些事情
  $word->Selection->TypeText("This is a test...");
  $word->Documents[1]->SaveAs("Useless test.doc");
  
  //关闭 word
  $word->Quit();
  
  //释放对象
  $word->Release();
  $word = null;
  ?>
  
  以下为访问MSSQL数据库系统的简单例子:
  <?php   
  //访问MSSQL数据库系统
  echo '访问MSSQL<br>'   ;
  $dbConn=new  COM   ("ADODB.Connection")   or   die("创建COM失败");   
  $ADO='Provider=sqloledb;Data Source=10.35.58.74;Initial Catalog=Tour;Min Pool Size=1;Persist Security Info=False;User;Password=fq15Ns@E#(';
  //"Provider=sqloledb;DataSource=10.35.58.112;Initial   Catalog=Tour;User   Id=sa;Password=sa;"; fq15Ns@E#(   
  //Access如:$ADO="DRIVER={Microsoft   Access   Driver   (*.mdb)};   DBQ="   .   realpath("mydb.mdb");     
  $dbConn->open($ADO);   
  //if($dbConn)   echo"create   conn   OK";   
  $rs=new   COM("ADODB.RecordSet")   or   die("创建RS失败");   
  echo"<br>";   
  //if($rs)   echo"create   rs   OK";   
  $sql="Exec P_SelUser 9001111";//"SELECT   *   FROM   user_userInfo";   
  $rs->open($sql,$dbConn,1,1);   
  
  while(!$rs->eof){   
  
  echo   $rs->fields["Account"]->value.":";   
  echo   $rs->fields["PhoneID"]->value;   
  echo"<BR>";   
  
  $rs->movenext();   
  }   
  
  $rs->Close;   
  $rs=null;   
  
  $dbConn->Close;   
  $dbConn=null;   
  ?>   
  这说明如果我们要使用PHP访问MSSQL,可以通过调用COM组件来实现。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102818-1-1.html 上篇帖子: 浅谈 PHP 神盾的解密过程 下篇帖子: 关于PHP写的投票网站之刷票风云
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表