2009-12-28 09:46:16 wl1121 阅读数 37
  • 黑客加密与解密精讲视频

    《黑客加密与解密》这套课程主要讲解软件加密与解密之PE文件结构,PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名,课程中代码会涉及到C和C++等知识。

    956 人正在学习 去看看 李强强

相对于开发工作,部署显得不是那么重要,但却是最困难的一步,也是最后一步。 
控件的部门总的说来要完成以下几件事,或者说实现以下几个功能: 
1、客户端第一次访问页面时自动安装(自动提示用户下载). 
2、有新版本发布时自动下载最新版并安装。 
经测试还发现,我的2.0框架下开发的控件,不能直接在客户机上进行注册(regAsm.exe:C#开发的ActiveX控件只能用此程序注册,而不能使用RegSvr32),不知道是不是框架版本的问题,只能做成安装文件。 
打包成安装文件具体的就不说了,和打包其他项目一样的步骤,但需要注意以下几点: 
1、针对控件生成的DLL中有一个Register属性,该属性一定要设置为vsdraCOM,否则安装包只会将DLL文件简单拷到你的目标目录下,设置该值后,安装包才会进行注册表的写入,相当于进行regasm注册。 
2、还有一个属性Permanent,看该属性的描述说明是说指定该DLL文件在卸载程序时是否移除,一般性的惯性思维都是设置为true时表示在卸载程序时要移除该dll文件,但经过测试发现设置为flase时才会进行移除操作。如果不移除老版本的文件,新版本安装时不会覆盖原有的文件。所以此属性显得很重要了。 
一般说来发布OCX最常用的就是打成CAB包,该方式最简单但也最麻烦,需要搞证书。所以我就自己实现了一种不需要证书的发布方式(前提是要生成安装包:XXXX.msi)。 
为了实现自动下载并安装,我把MSI包又制作为自解压包,之后文件名就变成了XXXXXXX.EXE了(这个包的制作就不多说了,用RAR直接可以进行压缩,网上也有很多介绍),这样当用户通过IE下载到本地后,IE会针对EXE类型的文件提示用户是否要现在运行,如果用户选择运行,就会进行自动安装了。整个实现原理就是如此的简单,但在简单的过程中却有比较麻烦的步骤,让页面通知客房端IE下载控件的步骤就较麻烦了。 
在控件所在的页面(我用的是JSP页面)只能使用JS脚本进行判断是否需要安装控件或者开载新版本进行安装。 
下面我说说通过JS来判断控件的问题。需要判断以下2个内容: 
1、判断是否需要新安装。 
2、是否发布了新版本的判断。 
   需要通过JS读取注册表(有这个东东注定该项目不能移植到非WINDOWS操作系统上了)下的控件的相关项或者键值。如果没找到相应的键则表示没有进行安装,需要新安装。具体判断逻辑直接上代码: 
主函数: 
   var lastModiDatetime = "<%=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-43C9-BD34-E9F3A6E87A85}\\InprocServer32\\">\\CLSID\\{80C07FCA-841C-43C9-BD34-E9F3A6E87A85}\\InprocServer32\\";  //80C07FCA-841C-43C9-BD34-E9F3A6E87A85就是开发篇强调的控件的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=")[1];                 
                 var versionNo = versionNos.substring(0,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 = '本地计算机上未安装“井场预警及实时数据显示控件”或此控件已被卸载,不能正确显示此页面,需要下载最新的控件!<br>'; 
             msg.innerHTML += "请[运行]自动下载的文件  或者    <a id='loadctl' href='<%=context%>/petrol/cab/wellalarmruntimedata.exe'>点击下载最新显示控件</a>";         
             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 f1 = fso.GetFile(path); 
                //FSO获取的文件最后修改日期是UTC格式的,JAVASCRIPT还没有对此日期格式操作对象.所以只有转换成字符来处理 
                //而且此UTC日期串与从北京时间转换来的UTC串格式不相同 
                var lastDate = ""+f1.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时间之前除格式不同外,在小时上还不相同。前者比后者少了8小时 
                //在小时上+上8小时,因为这个UTC时间是从北京时间转换来的 
                v.setHours(v.getHours()+8); 
                //把从北京时间转换来的UTC时间转换成数组,在后者中逐个匹配,都匹配上就说明时间相等 
                var ds = v.toUTCString().replace(",","").split(" "); 
                //为了保证不出现左右滑动匹配的情况(18不能与118、181匹配),在匹配项与被匹配项左右都加上一个空格 
                var baseUtc = " "+lastDate.replace("+0800","")+" "; 
                var isEqual = true; 
                for(var i=0; i<ds.length; i++) 
                { 
                    var temp = " "+ds+" "; 
                    if(baseUtc.indexOf(temp)==-1) 
                    { 
                        isEqual = false; 
                        break; 
                    } 
                } 
                if(!isEqual) 
                { 
                    document.getElementById("MWellAlm").click(); 
                    document.getElementById("MWellAlm").clearAll();   
                    msg.style.display = ''; 
                    ctlload.style.display = 'none';                     
                    msg.innerHTML = '本地计算机上安装的“井场预警及实时数据显示控件”不是最新版本,不能正确显示此页面,需要下载最新的控件!<br>'; 
                    msg.innerHTML += "请[运行]自动下载的文件  或者    <a id='loadctl' href='<%=context%>/petrol/cab/wellalarmruntimedata.exe'>点击下载最新显示控件</a>";                     
                    msg.innerHTML += '<br>注意:在安装最新控件之前请保证已通过[控制面板->添加或者删除程序]卸载了旧版本的控件!'; 
                    document.getElementById("loadctl").click(); 
                    return; 
                } 
             msg.style.display = 'none'; 
             ctlload.style.display = '';             
             document.getElementById("MWellAlm").click(); 
             document.getElementById("MWellAlm").start(); 
        } 
} 
以上就是我实现的控件发布的全部内容。为了保证能顺利发布,要求客户端IE最好把控件所在的站点加为信任站点,并调低安全限制,否则容易发生控件能显示,但不能进行用户交互的情况。
以上功能全部测试通过,而且现在项目中也在正常使用。
OCX技术现在不被人们所看好,也不被推广,但在实际项目中很多时候却不得不运用这些鸡肋技术来解决实际问题,或者实现特定功能,所以很多问题还要参考实际问题找到合适的解决办法。
 
c# ocx
2009-03-25 13:39:55 iteye_14831 阅读数 35
  • 黑客加密与解密精讲视频

    《黑客加密与解密》这套课程主要讲解软件加密与解密之PE文件结构,PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名,课程中代码会涉及到C和C++等知识。

    956 人正在学习 去看看 李强强
在C#中,其实没有OCX控件一说,相对应的只是COM组件,编译后也是.DLL,而不是.ocx.所以在C#中,在创建项目时只能创建类库项目。
然后就是具体的代码开发。(略)
要使组件成为能被网页脚本调用的OCX控件,在开发时,要注意以下几点:
1、必须要为将发布OCX控件的主类设置GUID码。该码在创建类库时,C#会自动生成一个(你可以使用,也可以重新生成),并存储在AssemblyInfo.cs中。设置GUID的代码参照以下:
namespace xxxx
{
[Guid("8d7d8518-ca58-4863-b94d-3c616fda7b35")]//从AssemblyInfo.cs文件中直接复制过来
public partial class RunData : UserControl, IObjectSafety
{}
}
2、必须要实现IObjectSafety接口。该接口需要手工创建一个接口类并让OCX组件实现。
完整的接口代码:(以下接口代码都是固定的,最好不要做其他改动)
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls.WebParts; //必须引用该包
using System.Security;
using System.Runtime.InteropServices; //必须引用该包
namespace RunData
{
/// <summary>
/// 把控件发布成com组件时必须实现的接口.该接口的GUID是固定的,不能修改,否则组件发布不成功
/// </summary>
[Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
// 方法定义
void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions);
}
}
接口实现:
public void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions)
{
pdwSupportedOptions = 1; //不要修改该代码
pdwEnabledOptions = 2; //不要修改该代码
return;
}
public void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions)
{
return;
}
3、对AssemblyInfo.cs进行编辑,修改相应的属性。包括以下属性及值:
// 则将该类型上的 ComVisible 属性设置为 true。
[assembly: ComVisible(true)] //将false更改为true,自动生成的注释也做了说明
//新添加下面的属性。该属性要求引用System.Security
[assembly: AllowPartiallyTrustedCallers()]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
//[assembly: Guid("80c07fca-841c-43c9-bd34-e9f3a6e87a85")] //注释掉该属性,此属性必须注释,最初我没有注释此属性,生成COM组件老是不成功,有警告,会影响最后的发布.试了N次才试出原因是没有注释此属性。
要引用:using System.Runtime.InteropServices;
4、编辑工程属性。
A、在[应用程序]页,输出类型必须指定为“类库”.
B、在[生成]页,必须勾选“为Com Interop注册”选项。
作了以上修改,如果能编译成功,则表示你的COM组件已够在你本机发布成功了。也说明你的组件本身没什么问题了。

你可以写一个测试网页对你的COM组件进行引用了。
如果是IIS,可以直接使用DLL引用方式进行引用,格式:
<object ></object>
也可以使用clsid方式引用。
如果非IIS应用服务器,如tomcat等,则只能使用CLSID方式。格式:
<OBJECT ID="DataCtl" CLASSID="CLSID:8d7d8518-ca58-4863-b94d-3c616fda7b35"></OBJECT>
"8d7d8518-ca58-4863-b94d-3c616fda7b35"就是最开始提到的那个GUID码!
在本机上运行此网页应该不会出现问题了,因为在开发组件的过程中VS.NET会自动进行组件注册。
使用OLE查看器可以查看当前组件是否成功注册到本机,如果没有找到该组件,应该使用手工注册方式进行注册。
通常情况下手工注册OCX都是采用RegSvr32.exe,但注册C#编写的COM组件推荐使用.NET自带的注册工具RrgAsm.exe工具,而且使用的注册工具版本一定要与开发框架版本一起发布的版本。
引用:http://qzone.qq.com/blog/3116246-1229694092
2009-12-28 22:46:00 liangdiwei 阅读数 949
  • 黑客加密与解密精讲视频

    《黑客加密与解密》这套课程主要讲解软件加密与解密之PE文件结构,PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名,课程中代码会涉及到C和C++等知识。

    956 人正在学习 去看看 李强强

C#代码
在C#中,实则没OCX控件一说,相对应的只是COM组件,编译后也是.DLL,而不是.ocx.所以在C#中,在创造项目时不得不创设类库项目。
然后乃是具体的代码开发。(略)
要使组件变为能被网页脚本调用的OCX控件,在开发时,要注意以下几点:
一、务必要为将公布OCX控件的主类设立GUID码。该码在创造类库时,C#能自动生成一个(你可以应用,也可以从新生成),依存储在AssemblyInfo.cs中。设立GUID的代码参考以次:
namespace xxxx
{
[Guid("八d七d8518-ca58-4863-b94d-三c616fda七b35")]//从AssemblyInfo.cs资料中直接复制过来
public partial class RunData : UserControl, IObjectSafety
{}
}
二、务须要兑现IObjectSafety接口。该接口急需手工创办一个接口种并让OCX组件兑现。
完整的接口代码:(以次接口代码都是固定的,最好不用做其余更动)
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls.WebParts; //务须摘引该包
using System.Security;
using System.Runtime.InteropServices; //务必引述该包
namespace RunData
{
///
/// 把控件公布成com组件时务须兑现的接口.该接口的GUID是固定的,不能批改,要不然组件公布不成功
///
[Guid("CB五BDC81-93C一-11CF-八F20-00805F二CD064"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IObjectSafety
{
// 步骤定义
void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions);
void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions);
}
}
接话柄现:
public void GetInterfacceSafyOptions(System.Int32 riid,out System.Int32 pdwSupportedOptions,out System.Int32 pdwEnabledOptions)
{
pdwSupportedOptions = 一; //不用批改该代码
pdwEnabledOptions = 二; //不用批改该代码
return;
}
public void SetInterfaceSafetyOptions(System.Int32 riid,System.Int32 dwOptionsSetMask,System.Int32 dwEnabledOptions)
{
return;
}
三、对AssemblyInfo.cs进展编者,批改呼应的属性。包括以次属性及值:
// 则将此类型上的 ComVisible 属性设立为 true。
[assembly: ComVisible(true)] //将false更动为true,自动生成的诠释也做了说明
//新平添下边的属性。该属性要求引述System.Security
[assembly: AllowPartiallyTrustedCallers()]
// 如若此项目向 COM 公开,则下列 GUID 用以门类库的 ID
//[assembly: Guid("80c07fca-841c-43c九-bd34-e九f三a六e87a85")] //诠释掉该属性,此属性务须诠释,最初我没诠释此属性,生成COM组件总是不成功,有警告,能影响最后的公布.试了N次才试出原因是没诠释此属性。
要引述:using System.Runtime.InteropServices;
四、编者工程属性。
A、在[应用程序]页,输出部类务必指定为“种库”.
B、在[生成]页,务须勾选“为Com Interop登记”选项。
作了之上批改,如果能编译顺利,则示意你的COM组件已够在你本机公布顺利了。也说明你的组件自身没事儿问题了。
你可以写一个测试网页对你的COM组件进展摘引了。
如果是IIS,可以直接施用DLL引述形式开展引述,格式:

也可以应用clsid模式摘引。
如若非IIS应用服务器,如tomcat等,则唯其如此运用CLSID模式。格式:

"八d七d8518-ca58-4863-b94d-三c616fda七b35"乃是最开始谈到的那个GUID码!
在本机上运作此网页应当不会出现问题了,由于在开发组件的过程中VS.NET能自动进展组件登记。
施用OLE查看器可以查看目前组件是不是顺利登记到本机,如若没找出该组件,应当应用手工登记形式开展登记。
通常情况动手工登记OCX都是采取RegSvr32.exe,但登记C#编撰的COM组件推荐运用.NET自带的登记工具RrgAsm.exe工具,并且施用的登记工具版本一定要与开发构架版本一行公布的版本。
本文来源:
我的异常网
Java Exception
Dotnet Exception
Oracle Exception

  • 2436 - ORA-00600: 内部错误代码
  • 2437 - PLS-00103: 出现符号 'CUR_EXTRACT '在需要下列之一时
  • 2438 - Failed to commit: Missing IN or OUT parameter at index:: 1
  • 2439 - ORA-06552: PL SQL: Compilation unit analysis terminated
  • 2440 - java.lang.InstantiationError: oracle.jdbc.driver.OracleConnection
  • 2441 - ORA-01019
  • 2442 - 触发器出错希望不要影响原来的插入事件
  • 2443 - EXP-00056: 遇到 ORACLE 错误 6550
  • 2444 - YYYY-MM-DD HH24-MI-SS英文操作系统出错
  • 2445 - 找不到oci.dll
  • 2446 - OCI-04030: 在尝试分配 16396 字节 (koh-kghu sessi
  • 2447 - ORA-06502: PL SQL: 数字或值错误
  • 2448 - ORA-01406: 读取的列值被截断
  • 2449 - MERGE编译错误
  • 2450 - java.sql.SQLException: 违反协议
  • 2451 - TNS:lost contact
  • 2452 - SQL Window cannot be closed
  • 2453 - IMP-00017: 由于 ORACLE 的 2270 错误,以下的语句失败
  • 2454 - Enterprisemanager configuration failed due to the following error
  • 2455 - kadbegcre OCIAnyData) 时进程内存不足
  • 2016-10-18 17:36:34 tong_zl 阅读数 5817
    • 黑客加密与解密精讲视频

      《黑客加密与解密》这套课程主要讲解软件加密与解密之PE文件结构,PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名,课程中代码会涉及到C和C++等知识。

      956 人正在学习 去看看 李强强

    最近导师给了个小任务,写一个C#上位机程序控制一款位移台的运动,位移台生产商给了VB程序和*.ocx文件以方便客户进行二次开发。

    (1)ocx文件要注册一下,打开VS自带的命令提示工具,输入regsver32.exe *.ocx即可(不过有可能出现文件的兼容性问题,这就比较坑了)。

    (2)在工具箱空白处右键→选择项→COM组件→*.ocx文件(当然这里需要点“浏览”找到你自己的文件)

    (3)在“引用”那里添加自己ocx文件生成的动态链接库dll文件,有两个*.dll和Ax*.dll(前3步的顺序我记不太清了)。

    (4)需要记住这个控件是一个类,使用前需要实例化并且还需要初始化,如下:

    </pre><pre name="code" class="csharp">        private AxXXLib.XX X = new AxXXLib.XX();
    
            public Form1()
            {
                InitializeComponent();
                ((System.ComponentModel.ISupportInitialize)(this.X)).BeginInit();
                this.Controls.Add(X);
                ((System.ComponentModel.ISupportInitialize)(this.X)).EndInit();
            }

    当然,从一开始着手到实现功能遇到无数麻烦,卡了好久,最后还是通过网上搜索大神们的解答解决问题,这里得好好感谢他们一番!

    这篇是记录自己的学习过程,也希望对其他遇到类似问题的人一点帮助。

    2018-03-09 13:15:31 xqaizx 阅读数 146
    • 黑客加密与解密精讲视频

      《黑客加密与解密》这套课程主要讲解软件加密与解密之PE文件结构,PE(Portable Execute)文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任何扩展名,课程中代码会涉及到C和C++等知识。

      956 人正在学习 去看看 李强强

    C#开发系统时,有时候会遇到调用其他语言开发的模块。如果对方提供了OCX时,就需要注册使用,但是实时时,每个客户端都注册一遍就比较麻烦。所以需要系统第一次启动时自动注册OCX。

    一:C#注册OCX

    首先,大家都知道在Windows的“运行”中,输入“Regsvr32.exe 路径”这样的方法来手动注册Dll控件(OCX),显示这种方法对于程序的自动化部署等带来极大的不便,因此,今天我们着重介绍如何用C#实现自动注册。

     

    既然可以在运行栏中输入“Regsvr32.exe 路径”的方法来注册,那么,一定可以在C#程序中采用同样的方法来调用Regsvr32,以实现注册:

    1
    2
    3
    4
    5
    6
    7
    Process p = new Process();
     
    p.StartInfo.FileName = "Regsvr32.exe";
     
    p.StartInfo.Arguments = "/s C:\\DllTest.dll";//路径中不能有空格
     
    p.Start();

     

    用这种方法,注意要添加对命名空间System.Diagnostics的引用:

    1
    using System.Diagnostics;

     

    另外,这种方法有一个不足之处,那就是注册工作是在本程序之外由Regsvr32.exe程序来完成的,系统内不方便知道注册的结果,也不方便对注册过程弹出的对话框进行自定义和控制。这里附Regsvr32的参数说明:(感谢网友伍华聪的提醒)

    regsvr32.exe是32位系统下使用的DLL注册和反注册工具,使用它必须通过命令行的方式使用,格式是:

    regsvr32 [/u] [/s] [/n] [/i[:cmdline]] DLL文件名

    命令可以在“开始→运行”的文本框中,也可以事先在bat批处理文档中编写好命令。未带任何参数是注册DLL文件功能,其它参数对应功能如下:

    /u:反注册DLL文件;

    /s:安静模式(Silent)执行命令,即在成功注册/反注册DLL文件前提下不显示结果提示框。

    /c:控制端口;

    /i:在使用/u反注册时调用DllInstall;

    /n:不调用DllRegisterServer,必须与/i连用。

     

    二:验证的OCX是否注册的方法

    调用注册表根据你要注册的ocx名称查询一下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /// <summary>
    /// 检查指定的 COM 组件是否已注册到系统中
    /// </summary>
    /// <param name="clsid">指定 COM 组件的Class Id</param>
    /// <returns>true: 表示已注册;false: 表示未注册</returns>
    public static System.Boolean IsRegistered(String clsid)
    {      
          //参数检查
          System.Diagnostics.Debug.Assert(!String.IsNullOrEmpty(clsid), "clsid 不应该为空");
              
          //设置返回值
           Boolean result=false;
          //检查方法,查找注册表是否存在指定的clsid
          String key = String.Format(@"CLSID\{{{0}}}", clsid);
           RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(key);
           if (regKey != null)
           {
                  result = true;
           }
             
           return result;
     
    }//end method

     

    参考文档:

    http://www.xqblog.top/Article.aspx?id=ART2018030600001

     

    没有更多推荐了,返回首页