在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组件来实现。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版
中文版,非常好用