手把手教你用CAB发表OCX的简约方法

【本文发布于2010年四月三10日,201一年10月15日原著搬家到此 】

前言:
这篇大家开头说一下虚构路线和Request对象,这个在asp.net中都以异经常用的小知识点,希望我们透过看那篇博客能够更进一步的强化对那多少个知识点的求学,尤其是编造路线的”~”的施用还有Request对象的片段性质等。

CAB是一种文件压缩格式,把OCX文件(ActiveX插件)压缩成CAB文件是为着公布它,
那种宣布办法给人倍感“浏览器会自行安装该插件”,多数恋人青眼于此。
近日盛行许多压缩工具,但WINRASportage那类工具生成的CAB文件浏览器无法识别。
经过试用,发现用Windows系统文件CABATiguanC来创造CAB是最简便实用的格局,
上边以打字与印刷控件Lodop为例,一步步领会创设CAB文件和安顿公布的历程:

  1. 特出路线标示”~” 虚拟路径

 

(1)
”/表示网址根目录(域名),../表示上级目录,./表示当前目录”等Http标准确定地点不均等,~是ASP.NET定义的特殊符号,是ASP.NET内部开始展览推介的用法,推荐财富一定都施用~从应用根目录开头定义,应用根目录和网址根目录的区分在于:如若将2个应用程序布置到http://www.cnblogs.com/hanyinglong本条目录上边,应用程序的根目录正是Http://www.cnblogs.com/hanyinglong,网址的根目录是:http://www.cnblogs.com。由此最佳用”~”,”~”并不会被浏览器认,因而ASP.NET会将以此门路转变为相对于网址的根目录的全路线在出口到浏览器中。

先是步、判别操作系统是还是不是有CABAHavalC文件 推断路子如下: 操作系统 开头->运转…->键入命令cmd->键入命令 CABA哈弗C
若呈现一大段版本申明和下令选项的英文表达,表示系统设有CABATiguanC,假诺不设有能够从网上搜贰个

  1. 编制程序处理”~”

或者从这里下载,下载解压后放到操作系统目录下。

(一)
如若在服务端控件中(使用runat=”server”的控件)会自行将”~”进行改变,假诺在HTML控件恐怕必要在代码中退换的话能够选用Virtual帕特hUtility类中静态方法实行虚构路径,全路径等的退换,比如:VirtualPathUtility.ToAbsolute(“~/a/b.aspx”)正是将虚拟路线转变为相对应于应用程序根目录的全路线,相当于”WebSite/a/b.aspx”。

 

(二) VirtualPathUtility类的最首要情势

第二步、准备ocx文件 把打字与印刷控件Lodop的实业ocx文件复制到C:\test目录下,并起名称为Lodop.ocx
注:安装过Lodop的机械中,ocx文件存放在C:\WINDOWS\system32\CAOSOFT_WEB_PRINT_lodop.ocx

 壹) string AppendTrailingSlash(string
VirtualPath);如若路线VirtualPath最终未有”/”则增加。

或Program
Files\MountTaiSoftware\Lodop下。

 二) string Combine(string basePath,string
relativePath);将多个门路实行统1。

 

 3) string GetDirectory(string virtualPath); 重临虚拟路线的目录部分。

第三步、制作CAB文件 在率先步的cmd窗口中,键入如下命令: CABA凯雷德C -s 614四 N c:\test\lodop.cab
c:\test\lodop.ocx 该命令施行完成后,在C:\test目录下会看到新生成的Lodop.cab文件。 在那行命令中,CABAHighlanderC之后有三个参数值,参数之间用空格分隔,
个中 -s 614四 俩参数表示生成的CAB文件之后能够开始展览代码签字,
要是现在不想签字,该参数能够不加,代码具名是个很纠结的主题素材,现在细说。

 四) string MakeRelative(string fromPath,string toPath);
计算四个虚拟路线的相对路线。

 

 5) ToAbsolute:转变为相对路线。

以上那步还有个简易方法,正是把该命令行字串用记事本复制到三个bat文件中, 譬如起名CreateLodopCAB.bat,须要生成CAB文件时双击该bat文件就可。
该格局切合平日发表同第壹行业品的不如版本。

(三) 举例说明:新建一个Web项目,起名称叫路线.aspx

 

   <a href=”/a.htm”>a</a> 

第六步、CAB文件的施用办法壹 插件用CAB公布的最简易方法是页面object对象的codebase直接指向该CAB文件,
把下部这段完整的超文本复制到1个html文件中,起名称为demo.html:

   <a href=”~/b.htm”>b</a> 

<html> <H1> Lodop CAB File
Test Page </H1><p> <object
classid=”clsid:2105C259-1E0C-4534-8141-A753534CB4CA”
codebase=”lodop.cab#version=5,0,5,7″ width=200 height=100 >
</object> </html>

   <asp:HyperLink ID=”HyperLink1″ runat=”server”
NavigateUrl=”/a.htm”>ce1</asp:HyperLink> 

把文件demo.html和第3步生成的lodop.cab放到同三个web目录下就ok了。
以上那段代码应该很好通晓,当中lodop.cab在此之前还是能够分包web路线,
也正是说插件能够单独安插,通过路线指向具体的安排地方。
今后您把浏览器的URubiconL通过web打开demo.html文件,测试看看是或不是“自动安装”。

   <asp:HyperLink ID=”HyperLink2″ runat=”server”
NavigateUrl=”~/b.htm”>ce2</asp:HyperLink>

 

 然后拖放多个HyperLink控件,给多少个控件的Text起名字为Ce①,ce贰,给多少个控件的NavigateUPRADOl赋值为”/b.htm”,”~/b.htm”。在Page_Load事件下边写入如下代码:

第伍步、CAB文件的应用办法贰
页面还是能通过3个inf文件来发布插件,以便安顿多个ocx,此时超文本变成如下:

Response.Write(“<a href='” +
VirtualPathUtility.ToAbsolute(“~/a/b.htm”) + “‘>动态</a>” +
“<br />”);

<html> <H1> Lodop Test Page
</H1><p> <object
classid=”clsid:2105C259-1E0C-4534-8141-A753534CB4CA”
codebase=”lodop.inf” width=0 height=0 > </object>
</html>

Response.Write(VirtualPathUtility.Combine(VirtualPathUtility.AppendTrailingSlash(“~/a/b”),
“c.htm”));

其间lodop.inf是txt格式,内容如下:

  1. Request对象

[Add.Code] lodop.ocx=lodop.ocx

(壹)
Request.AppRelativeCurrentExecutionFilePath,获取当前实践请求的相对于选择根目录的杜撰路线,以”~”开头,比如:”~/第七篇/index.aspx”。

 

Response.Write(Request.AppRelativeCurrentExecutionFilePath);

[lodop.ocx] file=lodop.cab
clsid={2105C259-1E0C-4534-8141-A753534CB4CA} RegisterServer=yes
FileVersion=5,0,5,7

(二)
Request.physicalApplicationPath,获取当前采纳的情理路线,比如:E:\programmer\突然程序员演练题\aspnetpractice\ashx\

那些代码还算好领悟,不用累述。

Response.Write(Request.PhysicalApplicationPath);

如上轻松几步就贯彻了网页插件的“自动安装”安排,但遗憾的是,
在实行中那种设置分外“不活动”,因浏览器阻断而设置战败的可能率一点都不小。
针对那种景观,无论是知名的Flash照旧Lodop,都提供了exe格式的安装程序,

(叁)
Request.PhysicalPath,获取当前恳求的物理路线,比如:E:\programmer\意料之外程序员练习题\aspnetpractice\ashx\第七篇\index.aspx

让用户下载后举行安装。当然贰者组合起来布署,则是科学的采用!

Response.Write(Request.PhysicalPath + “<br />”);

(四)
Request.RawUSportageL,得到原始请求U途睿欧L,比如:/ashx/第玖篇/Index.aspx,Request.U科雷傲L得到请求的UMuranoL,比如:http://localhost:2602/ashx/第7篇/Index.aspx,区别涉及到URL重写的问题。

      Response.Write(Request.RawUrl + “<br />”);

      Response.Write(Request.Url + “<br />”);

(伍)
Request.UrlReferrer网页的来自,能够依照那么些论断从百度搜到的哪个关键字,防下载盗链,放图片盗链,能够欺上瞒下“本图片仅供天涯论坛内部调换使用”,全局防盗链用Globals.asax。

(陆) Request.UserHostAddress获得访问者的IP地址

Response.Write(Request.UserHostAddress + “<br />”);

(七)
Request.UserLanguage得到访问者浏览器帮忙的语言,能够通过那些完成对两样语言的人出示分裂页面。

Response.Write(Request.UserLanguages + “<br />”);

(八)
Request.Cookies获取浏览器发过来的浏览器端的库克ie,从他中间读取Cookie值,比如:context.Request.Cookies[“mysessionID”],使用Request.Cookie的时候一般只是读取,将Cookie写回浏览器要用Response.Cookies。

(九)
Request.MapPath(virtualPath)将虚拟路线转变为磁盘上的情理路线,request.Mappath(~/第七篇/index.aspx)就会获取:E:\programmer\蓦然程序员演练题\aspnetpractice\ashx\第七篇\index.aspx

 Response.Write(Request.MapPath(“~/第七篇/index.aspx”));

(10)
新建三个文本夹Request对象,然后新建二个一般处理程序,新建三个HTML页面,在HTML页中写入如下代码:

<img src=”图片.ashx” />

图片 1图片 2View Code

context.Response.ContentType = "image/JPEG";

         string fullPath = HttpContext.Current.Server.MapPath("1.jpg");

         using (System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(fullPath))

         {

             using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap))

             {

                 if (context.Request.UrlReferrer == null) //如果直接浏览则没有URlReferrer

                 {

                     //g.Clear(System.Drawing.Color.White);

                     g.DrawString("禁止直接浏览图片,请在页面中查看", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0);

                 }

                 else if (context.Request.UrlReferrer.Host != "localhost")

                 {

                     g.Clear(System.Drawing.Color.White);

                     g.DrawString("本图片仅限内部使用", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0);

                 }

                 g.DrawString("你的IP是:" + context.Request.UserHostAddress, new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0);

                 if (context.Request.UserHostAddress == "127.0.0.1" || context.Request.UserHostAddress == "192.168.0.1")

                 {

                     //如果直接访问图片URLReferrer就是null,如果是嵌入到别的网页中的请求,URLReferrer就是页面的地址

                     g.Clear(System.Drawing.Color.Blue);

                     g.DrawString("IP被屏蔽", new System.Drawing.Font("宋体", 20), System.Drawing.Brushes.Red, 0, 0);

                 }

             }

             bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

         }

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图