热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP调用COM组件的说明

PHP调用COM组件的说明,
在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类进行访问,即可。

代码如下:

$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的简单例子:

// 启动 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数据库系统的简单例子:

     //访问MSSQL数据库系统

     echo '访问MSSQL
'   ;

          $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"
";  

          //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"
";  

   

                  $rs->movenext();  

          }  

   

          $rs->Close;  

          $rs=null;  

   

          $dbConn->Close;  

          $dbCOnn=null;  

  ?>  

这说明如果我们要使用PHP访问MSSQL,可以通过调用COM组件来实现。

 

 

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
刺嫩芽豆豆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有