转载: 从网页上下载控件时制作CAB包的方法

6 11 月, 2007
Internet 软件分发单位是软件包,它由包含 .inf 文件或软件分发 (.osd) 文件(或两者都包括)的 CAB 文件 (.cab) 所组成。一个分发单位也可以包含软件组件,如 ActiveX 控件 (.ocx).dll 文件、.exe 文件、Java 类文件或小程序。当 Web 页上 OBJECT 元素的 CODEBASE 特性引用包含.inf 文件的 CAB 文件时,Internet Explorer 3.0 和更新的版本将自动把 CAB 文件作为软件分发单位。
第一步:创建一个inf文件:
INF
文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)
一个INF文件就捆绑了CAB压缩文件所有的必须文件。缺省情况下,
与现有硬盘中文件版本号相同的文件不被下载。
要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,
请参考平台软件开发工具包(Platform SDK)的设置和系统管理服务(Setup and System Management Services)
部分的\Setup API\Overview\INF Files目录下的内容。
下面就以我自己写的一个videoweb.dll为例子。在videoweb.dll中使用到:tdiio.dll,encoder.dll,decoder.dll,tdiio.ini,user.ini,
camer.ini,drivo.ini.
video.inf
的例子:
;inf file for videoweb.dll
[version]
signature=$CHICAGO$

[DestinationDirs]
DLLSysCopy=11
IniWinCopy=25

[DefaultInstall]
CopyFiles=DllSysCopy,IniWinCopy
AddReg=videoReg

[DllSysCopy]
tdiio.dll
Decoder.dll
VideoWeb.dll

[IniWinCopy]
camer.ini
user.ini
xvidMP4.ini

[videoReg]
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC},"",REG_SZ,"Video Class"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\Control
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\Implemented Categories
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\InprocServer32,"",
REG_SZ,"11\VideoWeb.dll"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\InprocServer32,"ThreadingModel",
REG-SZ,"Apartment"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\MiscStatus,"",
REG_SZ,"0"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\MiscStatus\1,"",
REG_SZ,"131473"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\ProgID,"",
REG_SZ,"VideoWeb.1.1"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\Programmable
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\ToolboxBitmap32,"",
REG_SZ,"11\VideoWeb.dll,102"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\TypeLib,"",
REG_SZ,"{FC4352CB-BB55-498C-BB21-E4BAE2FC2584}"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\Version,"",
REG_SZ,"1.0"
HKCR,CLSID\{4BDA0AA3-2164-44B7-8A88-208A145F51DC}\VersionIndependentProgID,""
,
REG_SZ,"VideoWeb.1"
;end of INF file

DestinationDirs:指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32;
10
规定为窗口目录、WINDOWS或者WINNT
videoReg
:如果是自己写的控件:可以在本地先用regsvr32 xxx.dll注册后,从注册表中找到上面的注册信息。
当然以上仅仅是在internet上分发软件时一个很简单的inf文件,还有更复杂的inf文件。请看SDK

第二步:把video.inf, tdiio.dll,encoder.dll,decoder.dll,tdiio.ini,user.ini,
camer.ini,drivo.ini.
放在一个文件夹中。
第三步:开始制作cab文件,我是用IExpress工具制作的(该工具在winnt\system32目录下面)。
1
:选择创建新的自解压指令文件。
2
:选择仅创建压缩文件(ActiveX安装)
3
:点击添加把你要供别人下载的文件添加
4
:点击浏览输入*.cab文件的存放地址(包含文件名)
5
:就随便了
好了制作完成。
现在在你的网页中使用该控件,当别人访问你的网页时,如果他的机子上没有你的控件,浏览器就会自动下载安装。因为你的控件可能没有获得签名
因此得在你的浏览器中把浏览器的安全级别降低。在internet 工具中选择安全,选择自定义。找到下载未签名的ActiveX控件。选择其下面的提示或者启用。
在网页中插入:
<OBJECT classid=clsid:4BDA0AA3-2164-44B7-8A88-208A145F51DC
codebase="video.cab#version=2,0,0,1"
id=Video1 style="HEIGHT: 507px; WIDTH: 718px"></OBJECT>
该句.
注意:得把*.cab 文件你和的网页放在同一目录下。或者在codebase中指定*.cab的路径。

魔方六面玩法

3 11 月, 2007
高中的时候买过一个六面魔方,很容易就拼完一面,两面以上很少能拼成功,只记得成功拼过一次两面的,那是相临的两面,至于六面嘛,基本上是拆开拼成功的。
上大学到上班多年以来,没想到过关于魔方的事情,只是前段时间在同事的桌上看到过一个魔方才想起来的。接下来在每次逛街时都有意识的看看有没有魔方卖,但大多都是令人失望的。
直到前几天在东昌地铁站2号出口处从地摊顺利买到魔方,大的要价10元小的5元,后来还成8元买了一个大的,当天回到家很容易就把一面拼完,但两面以上都没撤。第二天用Google搜索魔方的六面玩法,一大堆成果,分析了两三篇然后打印了一份来仔细对照玩。经过多次摸索终于能成功拼完六面,而且口诀也背熟了。现在也学学网上的作法写点心得,记在这里供大家参考,也便于自己以后需要用时还能找回来。

Read the rest of this entry »

工行捷德U盾导入其它数字证书心得

2 11 月, 2007

偶然间在网上搜索到工行捷德U盾可以导入其它银行的数字证书的资料(连接),刚好自已手头有一个被废的捷德U盾(因工行的原因陪了一个新的U盾),索性就拿来试试。

手头没有数字证书,就拿老婆的支付宝帐户来开试(我自己的支付宝已经绑定到工行另一个金邦达2006U盾),申请数字证书并备份到本地硬盘,在IE里也安装成功。(注:安装到IE里的证书要允许“导出”,否则该证书是不允许导出到U盾的)

到工行的网站上下载捷德U盾的驱动程序(下载连接),到深圳发展银行下载对应的驱动程序(下载连接),本地提供抽提出来的工具 part1 part2)。安装从工行网站下载的U盾驱动,再安装从深发展网站下载的U盾驱动或下载本地抽提出来的工具解压使用(推荐,因为只有这个工具有用)。

证书的导入:
1. 插入U盾
2. 运行程序组里“工行个人网上银行证书工具软件”中的“智能卡管理工具”,可以看到“ICBC Token”卡的状态是“运行的”
3. 选择“数字证书”菜单的“显示注册过的数字证书” (新版驱动没有这个功能了)
4. 在“个人数字证书”列表可以看到U盾里已有的证书(绿色图标)和IE中安装的本地证书(电脑图标),选择需要导入的本地证书,点击下面的“传输ID到智能卡”按钮,依次点“是”按钮并输入U盾的密码确认,如果证书不允许导出会提示“属于数字证书的私有密钥不能导出(0xB009000B)”,不然就导入成功。
5. 把U盾拨出,看看IE中安装的本地证书还在不在,在就删除(通常情况下导入证书到U盾后系统会自动删除IE中的证)。

深发展的工具导入证书:
1. 从IE中导出证书,记住要选择“是,导出私钥”,设置证书保护密码,导入该证书时使用。
2. 插入U盾,运行深发展的工具“TokenToolcn.exe”,点“连接”按钮输入U盾的密码。
3. 选中“ICBC Token 已连接”项,点“导入证书”按钮,选择第1步导出的证书,输入设置的证书密码即可导入成功。
4. 加密保存第1步导出的证书,然后删除。

成功导入证书后下次需要用证书的时候插入U盾,会提示输入U盾的密码,成功输入后就可以进入系统。

这里说明一下,支付宝的证书由两份组成,其中有一份是在身份认证后生成的(生成时依赖于另一份),不能导出也不需要导出;另一份可以成功导出到U盾,使用时要求输入密码。

证书的删除:
1. 运行深发展的工具“TokenToolcn.exe”,点“连接”按钮输入U盾的密码。
2. 在“ICBC Token 已连接”下可以看到所有的证书,中文的证书可能看到乱码,不过没关系,选中它点“查看证书”就可以看到。
3. 选择需要删除的证书,点“删除证书”即可删除。

注意别把工行的证书(有ICBC字样的)误删了,除非不想用那个证书了。(工行的根证书可以删除,省空间)

后面这个深发展的工具其实也有“导入证书”功能,可以直接选择备份出来的证书文件导入。用这个方法导入证书不会导入证书的根证书,可以节省空间。用工行的工具导入证书时则会导入证书的所有根证书,占用相当多的空间。因此推荐使用深发展的工具管理证书,但驱动必须得用工行的驱动。

上海东方医院开给孕妇的咳嗽中草药处方

26 10 月, 2007
孕妇咳嗽中草药处方
名称 规格 数量 单价 金额
 (甲)前胡  千克  9克*3  0.04  1.13
 (甲)甘草(生)  千克  3克*3  0.03  0.28
 (甲)苦杏仁  千克  9克*3  0.05  1.30
 (甲)紫菀(炙)  千克  9克*3  0.03  0.73
 (甲)冬瓜子  千克  12克*3  0.02  0.68
 (甲)枇杷叶(袋)  千克  10克*3  0.01  0.33
 (甲)药袋  1  1只*3  0.20  0.60

经查,甘草和冬瓜子为孕妇慎用中草药,其它则没有特别说明,摘录部分如下:

名称

别名

性味

归经

功效

适应症

用量

注意事项

前胡

白花前胡,紫花前胡 

辛苦凉

肺脾 

宣散风热,祛痰,下气

风热头痛,痰热咳喘,消化不良,胎动不安,小儿夜啼

5-10

 

杏仁

苦杏仁,北杏

苦温

肺大肠

祛痰止咳,平喘,润肠

习惯性便秘,肺热咳嗽,哮喘,咽喉肿痛,支气管炎

4.5-10

阴虚咳嗽及泄泻者忌服

紫菀

 

苦温

温肺下气,止咳化痰

风寒咳嗽,虚劳咳嗽吐脓血,支气管炎,百日咳,肺结核

2-10

 

中药类:我国古代医家将孕妇禁用和慎用的40种中草药,编成了一首歌诀,叫《妊娠禁忌歌》,现抄录于下:螈斑水蛭与虻虫,乌头附子及天雄,野葛水银暨巴豆,牛膝薏苡并蜈蚣,棱莪赭石芫花麝,大戟蝉蜕黄雌雄,砒石硝黄牡丹桂,槐花牵牛皂角同,半夏南星兼通草,瞿麦干姜桃木通,硇砂干漆鳖爪甲,地胆茅根与蔗虫。这首歌诀所总结的禁忌药可分为三类:绝对禁用的剧毒药:螈青(青娘虫)、斑蝥、天雄、乌头、附子、野葛、水银、巴豆、芫花、大戟、硇砂、地胆、红砒、白砒。禁用的有毒药:水蛭、虻虫、蜈蚣、雄黄、雌黄、牵牛子、干漆、鳖爪甲、麝香。慎用药:茅根、木通、瞿麦、通草、薏苡仁、代赭石、芒硝、牙硝、朴硝、桃仁、牡丹皮、三棱、牛膝、干姜、肉桂、生半夏、皂角、生南星、槐花、蝉蜕等。此外,人们在实践中还发现下现中药也是孕妇应慎用的:瓜蒂、藜芦、胆矾、郁李仁、蜂蜜、甘遂、赤芍、朱砂、全蝎、枳实、红花、五灵脂、没药、雪上一枝蒿、莪术、商陆、当归、川芎、丹参、益母草、桃红、血竭、穿山甲、泽兰、乳香、毛冬草、吴茱萸、砂仁、豆蔻、厚朴、木香、枳壳、金铃子、黄莲、栀子、龙胆草、山豆根、大青叶、板蓝根、苦参、丹皮、生地、玄参、紫草、犀角、茅根、槐花、川乌、草乌、延胡索、细辛、白芍、白芷、甘草、酸枣仁、海龙、海马、芦荟、洋金花、天南星、太子参、王不留行、硫黄、樟脑、玄明粉、蟾酥、土鳖虫、红娘云、阿魏、猪牙皂、路路通、八月木、柴胡、天仙子、马鞭草、白附子、麻黄、冬葵子、蓖麻油、番泻叶等。总之,孕妇应禁用和慎用的中药,概括起来为毒药、活血化瘀药、行气驱风药、苦寒清热药、凉血解毒药。

重回16300拨号的日子

23 10 月, 2007

一起住了4年零4个月的同事搬到新家去了,由于忍受不了有线通时快时慢、高峰龟爬的网络,停用了用同事身份证开户的有线通(他们的新家不支持有线通,无法移机)。

由于最近不经常使用网络,加上不想让老婆回到家里就老上QQ,所以近来还不打算安装电信的宽带,只有先凑合着用16300拨号了。由于用户和密码都是16300的帐号费用比较贵,昨天在淘宝上买了一张50元的16300时段卡,每小时的上网费是0.6元(23:00-8:00及节假日全天减半计算),花了18.8个大洋买的,电话费是每分钟0.02元。今天让老婆把笔记本电脑带回来试试拨号和网络共享,都实现了,麻烦的是用完了得把笔记本电脑的无线上网卡IP给换回去,不然老婆明天上班就用不了了。

试了几家网上银行,都还能操作,慢是慢了点但总比跑网吧方便和安全吧。

新闻网站和海外网站都打得开,QQ也得上,重回了2000年的感觉。

俺的博客也可以写写,呵呵,在此先记一笔。

对了,在这记一下16300时段卡的费用查询链接,方便查询费用。
上海电信16300卡自助查询

认购《上投摩根亚太QDII基金》的故事

18 10 月, 2007

上周六(10.13)收到招行代销上投摩根亚太QDII基金的短信,说是周一(10.15)该基金开始认购。由于经常收听上海财经电台(FM97.7MZ)的早、晚财经60分,加上近段对沪深股市的一些了解,对沪深股市的高风险有避之无不急的意,所以对早期获得投资海外股票的基金有些青睐。

与老婆讨论后决定10.15认购该QDII基金,立马用老婆的招行帐户登录先申请开户,深入了解该基金时发现起始认购金额是1万元,查查自己招行卡上的余款,才1千7,加上通过贝宝从工行转过来的周一才到帐的7千还差1千3,怎么办呢?

首先把招行卡1天到帐的3千货币基金赎回,周一算赎回日那周二上午才到帐,时间可能来不及,再想想其它办法;

方案一:周一的时候到公司找招行卡上有钱又能转出的同事先借2000元,周二的时候还上,目标同事是罗建平和吴阳平。

方案二:改买嘉实的海外基金,起始认购额才5千,认购期间从9日到19日,周一还在有效时间内。可仔细一查,人家9日开始认购当天就超额认购并已经停止认购了,此方案不可行。

从方案二了解到的嘉实海外基金认购首日就超额联想到上投的认购也过不了首日,方案一的可行性又不得而知,所以还得找方案三:突然想起工行卡上还留有打算还信用卡的800块,号称老婆私房钱的浦发东方卡上还有1千元,合在一起刚好够,呵呵说干就干。

和老婆说了我的方案三,可行!周日起来找到几帐卡,顾不上吃中午先去招行的自助银行,从工行卡了取了800元(2元跨行手续费)、东方卡上取了1千(东方卡跨行取现1000及以上免跨行手续费,上海招行跨行1000及以上也免),存了1千3到招行卡,一切搞定,只剩贝宝未到帐的7千了。

10月15日当天上午查了几次贝宝的钱都还没有到帐,有点急了,好不容易等到中午吃完饭,再查发现钱到帐了,兴奋!

自己的卡上钱凑在一起刚好1万,通过招行专业版转到老婆的卡上(不在自己招行卡上认购另有原因,略),立马认购,看到一个笑脸图标,通过,放心了!

抽空翻了一下关于上投该基金的评论,发现有的贴子说上投不开通新开户请求了(郁闷中...),又有的贴子说又允许了(悻悻中...),总之不管了。

16、17日两天登录看结果,没有结果,只知道15日认购首日就超额认购了两培多,本来才300亿的结果认购达1000亿,预计配售比例不超过30%(又郁闷了)。

今天终于看到结果了,成功认购2580.40元(配售比例25.804%),解冻7419.60元,手续费38.13元,份额2542.55。解冻的钱又花6千去卖货币基金,1千元还到老婆的东方卡了作她的私房钱,其余的转到我工行卡上去还信用卡了。

大蒜青鱼

29 9 月, 2007

大蒜青鱼

材料:青鱼(草鱼)一段,大蒜2个,大葱一小根,泡椒、泡姜、花椒、白糖、料酒、豆粉、酱油(生抽)、醋、盐、油适量。

 

做法:

第一步:将青鱼洗净,用刀从背脊上将它分成2半,去掉背脊的大骨头,再在鱼身上划些小口。用少量盐涂在鱼身上,放点豆粉,再用料酒将鱼腌起来。

第二步:将大蒜去皮切成小团;泡椒,泡姜,生姜切好;大葱洗净,切成小段。

第三步:开火,放适量的油,把油烧热,将腌好的鱼放油锅的快速的过一下,放少许白糖,然后捞起锅。

第四步:将准备好的大蒜团,泡椒,泡姜,生姜,花椒放入油锅中炒,炒出香味来了,加入适量的酱油,料酒,少许醋,再炒1分钟左右,放入油酥过的鱼。

第五步:鱼放入锅内了,将锅里的汁浇在鱼身上,这样用中火烧10分钟左右,鱼肉熟了,放大葱,味精,起锅。这样一盘可口的大蒜青鱼就做好了!!!

 

 

识破超市的“温柔一刀”

18 9 月, 2007

我们知道,超市的目标就是要让顾客尽可能的多花钱,只有钱从“上帝”口袋里转入超市的帐户上,超市才能有利润,才能盈利。那他们的策略是什么呢?

精明的超市总是把众多中高档商品,消费者并不急需的商品摆在显眼的地方,让顾客有更多发现、欣赏的机会。而把普通人家日常需要的食品和生活小用品放在超市里面,甚至让顾客历经艰辛,让他们在找到自己必须购买的物品之前,把超市琳琅满目的物品都“检阅”一遍。这样,超市众多的商品就得到了更多的销售机会。

对于超市如此策略,如果消费者您有足够的钱,安心受超市的一切,大把大把的消费,也无可厚非,毕竟“牡丹花下死,做鬼也风流”,会花钱才会挣钱。如果你钱不够多,甚至需要一分钱掰成两分钱用,那就单刀直入,直奔主题,买上自己的必需品,然后“非急需之物勿视,非急需之言勿听,非急需之物勿闻,非急需之物勿言”,发扬雷锋似的高尚觉悟,把花钱的机会“慷慨”地让给别人吧。

不过,这是个人隐私,不要轻易外传,要不超市会关门的,呵呵

从博弈论看“抵制日货”

18 9 月, 2007

最近在看谢洪波写的《生活中的博弈论》,关于日本问题摘录两段如下,让我们一起来抵制日货

对于日本这样一个只崇拜强者的近邻,我们只能以实力来求得与对方的均衡,赢得对方的尊重。中日双方政治冷淡,这是事实,也是策略,但对于中国来说,政治寒冷,贸易额也屡创新高的“经热”对自己极为不利。日本从中国得到了巨额贸易顺差,实力更加强劲,这无异于资敌养虎;而与日本经济越密切,给欧美进入中国市场从中分食蛋糕的机会就少,反而加剧中国与欧美的贸易摩擦,使中国没法玩转“经济牌”。

日本与中国和韩国都存在岛屿与主权冲突,但日本在与中国钓鱼岛的冲突中采取强硬态度,而在与韩国的“独岛”冲突中采取软弱态度,方式截然不同,根源何在?日本人自己说过:“对韩国人再好,他们不会买日本的产品;对中国人再坏,他们还是愿意买日本产品。”这就是经济上的“投降”付出的政治和国土代价。因此,对日本只有减少经济上对它的“资助”,让它看到一个国家、一个民族的自强、自信,它才会低下高傲的头颅,主动修好双边关系,减少近邻“近攻”的威胁,进而削弱超级大国在东亚的支柱。

C# PropertyGrid自定义UserControl项不可编辑实现

10 9 月, 2007

C#的PropertyGrid控件支持给属性项自定义Converter和Editor,当指定从TypeConverter派生的Converter时可以只能从下拉列表中选择,即属性值不可手工编辑,但不支持UserControl;而指定从UITypeEditor派生的Editor可以支持UserControl但又没办法限制用户直接编辑属性值。

有时我们需要实现既能从UserControl中设定值又不想让用户直接编辑,就象一些Collection一样,只显示"(Collection)"串不可编辑又可以通过下拉或弹出窗体让用户选择。经过多次实现,发现属性项同时指定自定义Converter和Editor可以解决这个问题,后面附一些实现代码。

定义属性项:
        private ItemContent _itemContent = new ItemContent();
        [EditorAttribute(typeof(ContentEditor), typeof(UITypeEditor)),
        TypeConverterAttribute(typeof(ConentConverter)),
        DescriptionAttribute("Select item content")]
        public ItemContent Content
        {
            get { return _itemContent; }
            set { _itemContent = value; }
        }

定义属性内容类:
    public class ItemContent
    {
        private string _type = "Type";
        private string _content = "Content";

        public string Type
        {
            get { return _type; }
        }

        public string Content
        {
            get { return _content; }
            set { _content = value; }
        }
    }

定义Converter:
    public class ConentConverter : ExpandableObjectConverter
    {
        public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
        {
            return true;
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if (destinationType == typeof(ItemContent))
            {
                return true;
            }

            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == typeof(System.String) &&
                value is ItemContent)
            {
                return "(Collection)";
            }

            return base.ConvertTo(context, culture, value, destinationType);
        }
    }

定义Editor:
    public class ContentEditor : UITypeEditor
    {
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            return UITypeEditorEditStyle.DropDown;
        }

        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            SelectControl ctrl = new SelectControl();

            if (value is ItemContent)
            {
                ctrl.Selected = (value as ItemContent).Content;
            }
            service.DropDownControl(ctrl);

            (value as ItemContent).Content = ctrl.Selected;

            return value;
        }
    }

实现SelectControl的UserControl,提供Selected属性,做一些操作。

最后将包含有ItemContent属性的类对象赋给PropertyGrid的SelectedObject即可。