写COM组件用于ASP/PHP等动态网页
来源:互联网 发布:apache源码包下载 编辑:程序博客网 时间:2024/06/06 09:14
ASP、PHP等动态网页语言的功能已很强大,但COM能使它如虎添翼。其实我们平时用的ADO、FSO、Jmail等也就是COM。借助COM,WEB可以调用本地应用程序的几乎所有功能来反馈给页面。例如,查询服务器的各盘使用情况,CPU占用率等,最后给出一个例子,用COM查询IP对应的地埋位置。
开发COM的工具也就是开发EXE应用程序的工具,VB、VC、Delphi都可以。但VB具有天生的优势,几行代码就可以写出COM来。VB中,COM又叫ActiveX DLL。下面借用一个很简单的示例 ,判断年份是否为闰年。
新建一个ActiveX DLL工程,将工程名命为CheckYear,自动生成的类名命为LeapYear。写下如下代码:
Option ExplicitPublic Function IsLeapYear(yr As Variant) As Boolean If yr Mod 4 = 0 And yr Mod 100 <> 0 Then IsLeapYear = True Else IsLeapYear = FalseEnd Function
咳,简单得有点不适应。就这样COM做好了,生成DLL即可。然后注册它。在运行中输入“regsvr32 H:\checkyear.dll”即可。如果你本机架有IIS或NetBox,可以在ASP网页上调用它了。如果用于服务器,那么上面这件事则需要在服务器上做。ASP调用代码如下:
<% Option ExplicitDim oCheckYear,sDim Year, isleapYearYear=2004Set oCheckYear=CreateObject("CheckYear.LeapYear")isleapyear=oCheckYear.IsLeapYear(Year)Set oCheckYear=Nothing%><body><% If isleapYear=True Then s="是闰年!" Else s="不是闰年!"%><%=Year%>年<%=s%></body>COM在EXE应用开发工具中也可以调用。在写复杂的COM时,可以用他们来检测功能。COM注册后,在VB中的“引用”列表中可以看到。例如下面是VB调用它的代码:
Private Sub Command1_Click() Dim c Set c = CreateObject("CheckYear.LeapYear") Dim d As Boolean d = c.IsLeapYear(2004) MsgBox dEnd Sub
COM打开了一扇无限可能的门,下面就是看你发挥了。金蝶、用友等非常擅用此类方法。它们主要是把COM当成标准DLL用(因为VB开发标准DLL不方便啊),利用工作分配豚团队合作。下面给出一个用COM查询IP对应的地埋位置的例子。WebService想必大家用过,很多门户或厂商以免费的WebService的方式提供天气、股市等信息。我们在程序中直接用URL就可以访问它。这里要说的是一个非公开的、非正式的“服务”,即IP138网站提供的IP信息查询页面,http://iframe.ip138.com/ic.asp,它返回简单的IP和所在地信息,如“您的IP是:[17.89.9.11] 来自:广东省深圳市 电信”。我的程序中就向它请求信息查询用户所在地,这比自己查数据库省事多了,而且它号称它的地址永远是最新的。可是好景不长,这个URL稳定地存在了N年,却在最近失效了。不过,我们很快可以找到其他页面。这个也可以用到COM中,之后,我们自己的页面上只要调用COM中提供的方法就可以了。有人要问:这样岂不总是得到服务器的地址信息?事实上,IP138同时也提供对指定IP的查询。查询IP的网站非常多,百度一下有几百个,如http://ip.cn/index.php?ip=211.11.85.5,新浪的http://int.dpool.sina.com.cn/iplookup/iplookup.php?ip=22.73.22.80等,URLk末尾ip=x.x.x.x即是指查询该IP的地理位置。要注意字符集问题,如果是GBKakGB2312的则中文无需特别处理,如果是utf-8或其他,则需转换一下,否则会出现乱码。
VB中新建ActiveX DLL工程,名为IP2City,建个类名为clsIP,方法名GetCityName,输入参数是IP字符串,输出为城市名(地理位置)。代码如下:
Option ExplicitPublic Function GetCityName(vIP As Variant) As String Dim sUrl As String, sCode As String, sCity As String, c() As String, d() As String sUrl = "http://ip138.com/ips138.asp?ip=" & vIP sCode = GetURL(sUrl) c = Split(sCode, "本站主数据:") If UBound(c) >= 1 Then sCity = c(1) d = Split(sCity, "</li>") sCity = d(0) End If If Len(sCity) > 20 Then sCity = Left(sCity, 20) GetCityName = sCityEnd FunctionPublic Function GetURL(URL) As String On Error GoTo a0: Dim i, j j = 0 Dim XMLHTTP As Object Set XMLHTTP = CreateObject("MSXML2.XMLHTTP") If Not IsObject(XMLHTTP) Then Set XMLHTTP = CreateObject("Microsoft.XMLHTTP") If Not IsObject(XMLHTTP) Then Exit Function End If XMLHTTP.Open "GET", URL, True XMLHTTP.setRequestHeader "If-Modified-Since", "0" '使用MSXML2.XMLHTTP和Microsoft.XMLHTTP方法时,这条指令相当于清除缓存 XMLHTTP.send i = Now() Do 'While XMLHTTP.ReadyState <> 4 DoEvents Loop Until XMLHTTP.ReadyState = 4 Or j = DateDiff("s", i, Now()) > 4 GetURL = StrConv(XMLHTTP.responseBody, vbUnicode) Exit Functiona0:End Function
编译后,这个COM既可以用于EXE应用程序,也可以用于ASP/PHP等动态页面。例如下面是ASP中调用的代码:
<% 'Option Explicit Dim oIP,sFrom,sCityName sFrom=request.ServerVariables("REMOTE_ADDR") Set oIP=CreateObject("IP2City.clsIP")sCityName=oIP.GetCityName(sFrom) Set oIP=Nothing %> <body> <center>您的IP是:[<%=sFrom%>] 来自:<%=sCityName%> </body>
最后提一下COM注册问题。我的开发机器是Win7 64位,开发、注册到调用都很顺利,然而拷到服务器Win2003上之后ASP却无法调用。显示“没有权限 'Create Object'”错误。热百度上几乎千篇一律只有一个答案,在控制面板中如何如何,而对自制控件不适用。折腾了几个小时,最终的解决方法是,在DLL文件的属性-安全页中,手工增加用户EveryOne。这么所谓增加安全性?我只能说:微软大脑有屎,浪费别人时间就是浪费别人生命。
全文结束。
- 写COM组件用于ASP/PHP等动态网页
- C#写COM组件提供ASP使用
- 动态网页语言ASP PHP ASP区别
- 动态网页技术JSP、ASP、PHP
- 动态网页技术JSP、ASP、PHP
- [转]使用ASP调用C#写的COM组件
- 使用ASP调用C#写的COM组件
- 使用ASP调用C#写的COM组件
- 基于ASP和COM组件的动态图表显示
- MFC写COM组件
- ASP.NET2.0动态修改网页关键字、标题等
- 在ASP网页中使用COM组件-创建Visual Basic COM 对象
- Com组件开发用于浏览器插件
- ASP PHP和JSP三大动态网页技术
- 用C#写COM组件
- C++写一个COM组件
- Asp.Net中Word,Excel等office com组件操作权限的问题
- Asp.Net中Word,Excel等office com组件操作权限的问题
- openwrt编译内核
- 编程之美格格取数(为什么一直是WA,求测试)
- Hibernate 自动生成bo 映射是 default_schema 引发的问题
- 启动LFS,检测大多是FAIL,启动失败,电脑自动关机,需要重新编译LFS
- UNlit/Transparent 不发光透明shader
- 写COM组件用于ASP/PHP等动态网页
- 多重背包O(N*V)算法详解(使用单调队列)(转)
- linux内核分析--中断的分类
- (4)Struts2之Action
- C++ Primer笔记(五)语句
- 折半查找
- http://blog.csdn.net/duanyipeng/article/details/7024897 Cursor的moveToFirst和moveToNext
- 4.0上全屏显示
- hibernate之上的schema属性