C# OCX控件之调度详解

来源:互联网 发布:ubuntu安装分区教程 编辑:程序博客网 时间:2024/06/11 19:41

Js代码
相对于开发工作,支配显得不是那么主要,但却是最艰难的一步,也是最后一步。
控件的机构总起来讲要完成以次几件事,或者说兑现以次几个效能:
一、客户端第一回访问页面时自动装配(自动揭示用户下载).
二、有新版本公布时自动下载最新版并装配。
经测试还发现,我的2.0构架下开发的控件,不能直接在客户机进取行登记(regAsm.exe:C#开发的ActiveX控件唯其如此用此程序登记,而不能施用RegSvr32),不知道是否构架版本的问题,唯其如此做成安装文件。
封装成安装文件具体的就不说了,和封装其余项目同样的方法,但亟需注意以下几点:
一、针对控件生成的DLL中有一个Register属性,该属性一定要设立为vsdraCOM,不然装配包只会将DLL资料容易拷到你的目标索引下,设立该值后,装配包才会进展注册表的写下,无异于开展regasm登记。
二、再有一个属性Permanent,观该属性的描陈述明是说指定该DLL资料在卸载程序时是不是移除,一般性的惯性思想都是设立为true时示意在卸载程序时要移除该dll资料,但透过测试发现设立为flase时才会进展移除操作。如若不移除老版本的资料,新版本装配时不会覆盖原有的资料。之所以此属性显得很主要了。
通常来说公布OCX最惯用的便是打成CAB包,该形式最容易但也最烦劳,急需搞证件。之所以我就自个儿兑现了一种不需要证件的公布模式(大前提是要生成装配包:XXXX.msi)。
为了兑现自动下载并装配,我把MSI包又制造为自解压包,以后文件名就成为了XXXXXXX.EXE了(这个包的制造就未几说了,用RAR直接可以开展压缩,网上也有很多引见),这么当用户经过IE下载到本土后,IE能针对EXE门类的资料提醒用户是不是要现时运作,如若用户取舍运作,就会进展自动装配了。整个兑现原理乃是如斯的简略,但在简略的过程中却有比较烦劳的方法,让页面通报客房端IE下载控件的方法就较劳驾了。
在控件所在的页面(我用的是JSP页面)不得不应用JS脚本开展判断是不是急需装配控件或许开载新版本进展装配。
下边我说说经过JS来判断控件的问题。急需判断以次2个内容:
一、判断是不是急需新装配。
二、是不是公布了新版本的判断。
亟需经过JS读取注册表(有这个东东注定该项目不能移栽到非WINDOWS操作系统上了)停的控件的有关项或许键值。如其没找到呼应的键则示意没进展装配,亟需新装配。具体判断逻辑直接上代码:
主函数:
var lastModiDatetime = "

";//读取的服务器上的控件资料的最后批改日期
//判断目前当地电脑上是不是已登记了控件。
//如其已登记了控件,再度判断是不是是最新版本(JAVA现时没直接提供对资料版本的获取,透过获取资料最后批改日期来变相对照资料新旧)
//要兑现此效能,要求每一次公布新版本控件时务必在应用服务器上装配并登记最新的控件。
//并把装配途径停的最新RuntimeData.dll及RunData.dll和最新的装配包:
//wellalarmruntimedata.exe(依据RuntimeDataSetup.msi制造的自解压RAR装配包)拷到WEB应用程序停的petrol/cab停,拷RuntimeData.dll及RunData.dll是为了让JAVA能够获取控件的最新批改日期,拷wellalarmruntimedata.exe是为了让客户端IE在服务器上能找出下载途径及资料。
window.onload=function()
{
//在系统提醒用户是不是容许交互前判断目前控件是不是加载,透过此属性判断目前是不是登记了COM组件
var isReg = true;
//经过获取注册表属性失去装配途径
var hkey_root,hkey_path,hkey_key,path;
hkey_root="HKEY_CLASSES_ROOT"
hkey_file:////CLSID//{80C07FCA-841C-43C九-BD34-E九F三A六E87A85}//InprocServer32//">//CLSID//{80C07FCA-841C-43C九-BD34-E九F三A六E87A85}//InprocServer32//"; //80C07FCA-841C-43C九-BD34-E九F三A六E87A85便是开发篇夸大的控件的GUID
try
{
var RegWsh = new ActiveXObject("WScript.Shell");
hkey_key="CodeBase" ;
path = RegWsh.RegRead(hkey_root+hkey_path+hkey_key);
//获取本土机器上的组件版本号
var assembly = RegWsh.RegRead(hkey_root+hkey_path+"Assembly");
if(assembly!=null)
{
//获取版本号
var versionNos = assembly.split("Version=")[一];
var versionNo = versionNos.substring(零,versionNos.indexOf(","));
//查寻是不是登记此版本号.找出最新版本的便采取此版本的装配途径
try
{
var path = RegWsh.RegRead(hkey_root+hkey_path+ versionNo + "//" + hkey_key);
}
catch(ex)
{
isReg = false;
}
}
}
catch(e){}
//注意,当用户不允许脚本运行时path也是为NULL值,但只要装配登记了控件,不放管用户是不是同意脚本运作,
//MWellAlm控件都市被创造成object
if((path==null && document.getElementById("MWellAlm")==null) || !isReg)
{
//没登记此控件或许此控件已被卸载
msg.style.display = '';
ctlload.style.display = 'none';
msg.innerHTML = '当地电脑上未装配“井场预警及实时数据展示控件”或此控件已被卸载,不能准确展示此页面,急需下载最新的控件!
';
msg.innerHTML += "请[运作]自动下载的资料 或许 点击下载最新展示控件";
document.getElementById("loadctl").click();
return;
}
if(path!=null && document.getElementById("MWellAlm")==null)
{
alert("现阶段控件已装配登记但不能准确展示,请封锁全部的IE浏览器后重试!");
return;
}
document.getElementById("MWellAlm").stop(); //调用控件的步骤之一
//以次便是判断是不是公布了新版本
if(path!=null && path!="")
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var f一 = fso.GetFile(path);
//FSO获取的资料最后批改日期是UTC格式的,JAVASCRIPT还没有对此日期格式操顶牛儿象.之所以唯有转换成字符来处置
//并且此UTC日期串与从北京时间变换来的UTC串格式不相同
var lastDate = ""+f一.DateLastModified; //转换成字符串
var v = new Date();
v.setTime(lastModiDatetime);
//直连通过toUTCString()的格式:Thu, 18 Dec 2008 06:46:04 UTC
//获取的资料最后批改时间的UTC格式:Thu Dec 18 14:46:04 UTC+0800 2008
//经测试,这2个UTC时间预先除格式不同外,在钟头上还不相同。前者比后者少了八钟头
//在钟点上+上八钟点,由于这个UTC时间是从北京时间变换来的
v.setHours(v.getHours()+八);
//把从北京时间变换来的UTC时间转换成数组,在后者中逐一婚配,都婚配上就说明时间相等
var ds = v.toUTCString().replace(",","").split(" ");
//为了军令状不出现上下滑动婚配的状况(18不能与118、181婚配),在婚配项与被婚配项上下都加上一个空格
var baseUtc = " "+lastDate.replace("+0800","")+" ";
var isEqual = true;
for(var i=零; i {
var temp = " "+ds+" ";
if(baseUtc.indexOf(temp)==-一)
{
isEqual = false;
break;
}
}
if(!isEqual)
{
document.getElementById("MWellAlm").click();
document.getElementById("MWellAlm").clearAll();
msg.style.display = '';
ctlload.style.display = 'none';
msg.innerHTML = '当地电脑上装配的“井场预警及实时数据展示控件”不是最新版本,不能准确展示此页面,急需下载最新的控件!
';
msg.innerHTML += "请[运作]自动下载的资料 也许 点击下载最新展示控件";
msg.innerHTML += '
注意:在装配最新控件先头请军令状已透过[控制面板->增添也许删除程序]卸载了旧版本的控件!';
document.getElementById("loadctl").click();
return;
}
msg.style.display = 'none';
ctlload.style.display = '';
document.getElementById("MWellAlm").click();
document.getElementById("MWellAlm").start();
}
}
之上乃是我兑现的控件公布的所有内容。为了保证书能成功公布,要求客户端IE最好把控件所在的站点加为信赖站点,并调低保险限制,不然容易发生控件能展示,但不能开展用户交互的状况。
之上效能所有测试通过,并且现时项目中也在通常应用。
OCX技术现下不被人人所看好,也不被普及,但在现实项目中很多时分却只得应用这些鸡肋技术来解决实际问题,可能兑现特定效能,之所以很多问题还要参照实际问题找出适宜的解决办法。
本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

  • 2416 - Io 异常: The Network Adapter could not establish the connection
  • 2417 - Connect2DB Microsoft OLE DB Provider for Oracle -214767259
  • 2418 - ORA-19573: 无法获得 exclusive 入队 (数据文件 1 的)
  • 2419 - ERROR:ORA-01033: ORACLE initialization or shutdown in progress
  • 2420 - ora-01861 文字与格式字符串不匹配
  • 2421 - PETCH ryline INTO ryhang 的错误
  • 2422 - ORA-01033: ORACLE initialization or shutdown in progres
  • 2423 - oracle的数据库转移后的新库中使用sqlldr出错
  • 2424 - System.Security.SecurityException: 不允许所请求的注册表访问权
  • 2425 - Connection refused
  • 2426 - ora-20003
  • 2427 - ORA-02063
  • 2428 - error code 3:the system cannot find the path specified
  • 2429 - 01017:invalid username password
  • 2430 - PL SQL:Statement ignore
  • 2431 - ORA-01119: 创建数据库文件 某某某 时出错
  • 2432 - rownum写法
  • 2433 - ORA-00937: 非单组分组函数
  • 2434 - SP2-0734: 未知的命令开头
  • 2435 - 监听程序当前无法识别连接描述符中请求的服务