如何在vbscript中使用LoadPicture函数

  介绍

本篇文章为大家展示了如何在vbscript中使用LoadPicture函数,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

& lt; title> LoadPicture函数& lt;/title>,   & lt; form  name=癴rm"祝辞,   选择图片& lt; input 类型=癴ile", name=皃ic", onChange=癎etPicInfor()“,在,   时间/form> & lt;   & lt; script 语言=皏bscript"祝辞,   Sub  GetPicInfor (),   dim  objpic iWidth iHeight    dim  pictype picpath    picpath=document.frm.pic.value    set  objpic=Loadpicture (picpath),   iWidth =,圆(objpic.width /, 26.4583), & # 39; 26.4583是像素值,   iHeight =,圆(objpic.height /, 26.4583),   select  case  objpic.type    case  0,   时间=pictype “None",   case  1,   时间=pictype “Bitmap",   case  2,   时间=pictype “Metafile",   case  3,   时间=pictype “Icon",   case  4,   时间=pictype “Win32-enhanced  metafile",   最终获得select    document.write “你选择了图片“,picpath    document.write “& lt; li>长度:“,iHeight&“& lt;/li>“,   document.write “& lt; li>宽度:“,iwidth&“& lt;/li>“,   document.write “& lt; li>类型:“,pictype&“& lt;/li>“,   最终获得Sub    & lt;/script>

不过这个函数有个漏洞,可以探测电脑上存在的文件名.2004年的漏洞,微软现在也没补,示例:

& lt; form  onsubmit=癲oIt (); return  false"祝辞,   & lt; input  name=癴ilename",价值=https://www.yisu.com/zixun/癱:/ini”大?" 80 " type=" text ">   子loadIt(文件名)   LoadPicture(文件名)   终止子> “javascript脚本语言   函数doIt () {   尝试{   loadIt (form.filename.value);   }捕捉(e) {   结果=e.number;   }   如果(结果!=-2146827856){   alert('文件存在');   其他}{   alert('文件不存在');   }   }   

这段代码中有一个“魔法数字(数字)”26.4583,曾经有位昵称是“乱码”的朋友问过我这26.4583个是怎么来的,当时我也不知道。
前段时间逆向分析了一下vbscript。dll,才发现了其中的奥秘:

26.4583,=,2540,/,96


那你一定要问,这个2540和96又是怎么来的?

要弄清楚这个问题,首先要知道于六月的LoadPicture函数返回的到底是什么,根据文档是这么描述LoadPicture函数的:

返回一个图片对象。使用alt="如何在vbscript中使用LoadPicture函数”>

LoadPicture函数内部调用了OleLoadPicture函数,查文档可知返回的是IPictureDisp接口。不过后来我发现了更简单的方法,那就是查VB的函数声明(谁让它们是一家人呢),在VB的对象浏览器中查找LoadPicture函数:

函数LoadPicture((文件名),(大小),[ColorDepth], [X]、[Y])作为IPictureDisp虽然于六月的LoadPicture函数比VB的简单,但是返回值应该是一样的。

好了,知道返回的是IPictureDisp接口,文档说它支持下面的属性:

PropertyTypeAccessDescriptionHandle <强> OLE_HANDLE (<强> int )今Windows GDI的处理picturehPal <强> OLE_HANDLE (<强> int )RWThe Windows处理使用的调色板。类型<强>短今类型的图片(见PICTYPE)。宽度<强> OLE_XSIZE_HIMETRIC (<强> )今图片的宽度。高度<强> OLE_YSIZE_HIMETRIC (<强> )今图片的高度。

我们只关心宽度和高度,它们分别表示图片的宽和高,但是它们的单位不是像素(像素),而是Himetric,我们要做的是把Himetric换算成像素。

首先把Himetric换算成英寸(英寸),1 Himetric=0.01毫米,1英寸=2.54厘米,所以1英寸=2540 Himetric。

然后从英寸换算成像素,1英寸等于多少像素呢?这是由系统的DPI(每英寸点)设置决定的,默认值是96 .

现在知道2540年和96年是怎么来的了吧?不过上面的代码存在两个问题:第一,使用了2540/96的近似值,可能会有误差;第二,使用了DPI的默认值96,而DPI的值是可以在控制面板中修改的。

根据中LoadPicture函数的正确用法是:

Option  Explicit    & # 39;By  Demon    Dim  p    Set  p =, LoadPicture (“D: \ test.jpg"),   WScript.Echo “宽度:,,,,,Himetric2Pixel (p.Width),   WScript.Echo “高度:,,,,,Himetric2Pixel (p.Height),   Function  Himetric2Pixel (n),   & # 39;1,Inch =, 2540, Himetric    Const  key =,“HKEY_CURRENT_USER \ Control 面板\桌面\ WindowMetrics \ AppliedDPI",   Dim  WshShell, dpi    Set  WshShell =, WScript.CreateObject (“Wscript.Shell"),   时间=dpi  WshShell.RegRead(关键),   Himetric2Pixel =,圆(n  *, dpi /, 2540),   最终获得函数

如何在vbscript中使用LoadPicture函数