精华内容
下载资源
问答
  • 相比于传统的高分辨相位衬度成像技术,高分辨扫描透射电子显微镜可提供具有更高分辨率、对化学成分敏感以及可直接解释的图像,因而被广泛应用于从原子尺度研究材料的微观结构及成分。其中高角环形暗场像(HAADF-STEM...

    0ce7c9a9698e1e3d440496f810f11c1c.png

    近20年来,随着电子显微技术的不断发展, 高分辨扫描透射电子显微术(STEM)已经成为目前最为流行和广泛应用的电子显微表征手段和测试方法。相比于传统的高分辨相位衬度成像技术,高分辨扫描透射电子显微镜可提供具有更高分辨率、对化学成分敏感以及可直接解释的图像,因而被广泛应用于从原子尺度研究材料的微观结构及成分。

    其中高角环形暗场像(HAADF-STEM,Z 衬度像)为非相干高分辨像,图像衬度不会随着样 品的厚度及物镜的聚焦的改变而发生明显的变化,像中亮点能反映真实的原子或原子对,且像点的强度与原子序数的平方成正比,因而可以获得原子分辨率的化学成分信息。

    近年来,随着球差校正技术的发展,扫描透射电镜的分辨率及探测敏感度进一步提高,分辨率达到亚埃尺度,使得单个原子的成像成为可能。

    此外,配备先进能谱仪及电子能量损失谱的电镜在获得原子分辨率Z衬度像的同时,还可以获得原子分辨率的元素分布图及单个原子列的电子能量损失谱。

    因而,我们可以在一次实验中同时获得原子分辨率的晶体结构、成分和电子结构信息,为解决许多材料科学中的疑难问题(如催化剂、陶瓷材料、复杂氧化物界面、晶界等)提供新的视野。

    目前商业化的场发射扫描透射电子显微镜,不仅可以得到高分辨的Z衬度像和原子分辨率的能量损失谱,而且其他各种普通透射电子显微术(如衍射成像、普通高分辨相位衬度像、选区电子衍射、会聚电子衍射、微区成分分析等)均可以在一次实验中完成,因而高分辨扫描透射电子显微术将在材料科学、化学、物理等学科中发挥更加重要的作用。

    7162b8da9eb8c1b7c15b351e39ce3796.gif 扫描透射电子显微术工作原理

    扫描透射成像不同于一般的平行电子束透射电子显微成像,它是利用会聚电子束在样品上扫描形成的。

    如图1所示,场发射电子枪发射的相干电子经过会聚镜、物镜前场及光阑,会聚成原子尺度的电子束斑。通过线圈控制电子束斑, 逐点在样品上进行光栅扫描。在扫描每一个点的同时,放在样品下方且具有一定内环孔径的环形探测器同步接收高角散射的电子,对应于每个扫描位置的环形探测器把接收到的信号转换为电流强度,显示于荧光屏或计算机屏幕上,因此样品上扫描的每一点与所产生的像点一一对应。连续扫描样品的一个区域,便形成扫描透射像(STEM)。

    5b3ff20eca6cc40284a71e54d469ce33.png

    STEM工作原理

    在入射电子束与样品发生相互作用时,会使电子产生弹性散射和非弹性散射,导致入射电子的方向和能量发生改变,因而在样品下方的不同位置将会接收到不同的信号。

    7922b44cb456ecfd6bd372cb2d55d27e.png

    STEM中探测器分布示意图

    如图2所示,在θ3范围内,接收到的信号主要是透射电子束和部分散射电子,利用轴向明场探测器可以获得环形明场像(ABF)。ABF像类似于TEM明场像,可以形成TEM明场像中各种衬度的像,如弱束像、相位衬度像、晶格像。θ3越小,形成的像与TEM明场像越接近;

    在θ2范围内,接收的信号主要为布拉格散射的电子,此时得到的图像为环形暗场像 (ADF) 。在同样成像条件下,ADF像相对于ABF像受像差影响小,衬度好,但ABF像分辨率更高;若环形探测器接收角度进一步加大,如在θ1范围内,接收到的信号主要是高角度非相干散射电子,此时得到的像为高角环形暗场像(HAADF,Z衬度像)

    Z 衬度像利用高角散射电子,为非相干像,是原子列投影的直接成像,其分辨率主要取决于电子束斑的尺寸,因而它比相干像具有更高的分辨率。Z衬度像随试样厚度和物镜聚焦不会有很大变化,不会出现衬度反转,所以像中的亮点总是对应原子列的位置。

    根据Pennycook等人的理论,在散射角θ1和θ2所包括的环形区域中,散射电子的散射截面σ可以用卢瑟夫散射强度θ1到θ2的积分来表示,经过积分后可以得到:

    4878553f80492cac5eef894f8eb4a5bd.png

    其中m为高速电子的质量,m0为电子的静止质 量,Z为原子序数,λ为电子的波长,a0为玻尔半 径,θ0为博恩特征散射角。因此,在厚度为t的试样中,单位原子数为N时的散射强度Is为

    Is= σNtI

    这里的I 为单个原子柱的散射强度。

    从以上两式可以看出,HAADF探测器得到的像点强度正比于原子序数的平方,因而也被称为Z衬度像,这使我们能够凭借像点的强度来区分不同元素的原子,由此得到原子分辨率的化学成分信息,像的解释简明直接,一般不需要复杂繁琐的计算机模拟,因而Z衬度像尤其适合于材料中缺陷及界面的研究。

    STEM中除了通过环形探测器接收散射电子的信号成像,还可以通过后置的电子能量损失谱仪检测非弹性散射电子信号,得到电子能量损失谱(EELS),分析样品的化学成分和电子结构。此外,还可以通过在镜筒中样品上方区域安置X射线能谱探测器进行微区元素分析(EDS)。因此在一次实验中可以同时对样品的化学成分、原子结构、电子结构进行分析。

    7162b8da9eb8c1b7c15b351e39ce3796.gif 扫描透射电子显微术成像

    1. 原子分辨率HAADF像

    获得高分辨Z衬度像的两个必要条件是原子尺度的高亮度电子束斑和环形探测器。

    电子束的束斑只有小于或等于0.2 nm时才能获得原子分辨率的图像,因此将电子束聚焦为小而亮的束斑对于提高扫描透射电镜的分辨率至关重要。由于透射电子显微镜的电磁透镜存在很大的像差,限制了可形成的最小束斑及其电流强度,从而直接影响像的分辨率和信噪比。

    利用球差校正技术,可以使得电镜获得更小的电子束斑及更高的束斑电流强度。配备球差校正器的电镜在200 kV电压下可获得至少0.1 nm的电子束斑,同时电子束电流密度提高10 倍以上,使得Z衬度像的分辨率和探测敏感度进一度提高,电镜的分辨率进入亚埃尺度,可以获得单个原子的成像。

    高分辨率Z衬度像可以从原子尺度来研究界面、纳米相和缺陷结构成分以及元素偏聚等复杂的材料结构。

    2011 年,FEI 公司推出了配有ChemiSTEM 技术的球差校正Titan G2 80-200 电镜,将超稳定的高亮度Schottky FEG 源与探针校正技术结合,实现了0.08 nm 的原子分辨成像。

    2014 年5 月,日本电子株式会社(JEOL)发布了其新一代球差校正电镜JEM-ARM300F,HRTEM的分辨率可以达到0.05nm,HAADF-STEM分辨率达到0.063nm,将商业化的透射电镜推向了一个新极限。

    近几年来,球差校正扫描透射电子显微镜已经在从原子尺度认识材料发挥了重要作用。 以镁合金材料为例,孪晶是镁合金塑性变形的重要方式,控制孪晶的形成及生长是使镁合金获得良好成形性的关键。

    fe871b950e804b17d8411366e93b81c0.png

    图3 孪晶界处溶质原子周期性排列。(a),(b)为Mg-1.9 at.%Zn 合金孪晶界处HAADF-STEM 图像;(c),(d)为Mg-1.0 at.%Gd-0.4 at.%Zn 合金孪晶界处HAADF-STEM图像;(e),(f)为(c),(d)中图像的示意图,其中的TB为孪晶界(DOI: 10.1126/science.1229369)

    如图3所示,在一篇Science的工作中,Jianfeng Nie等采用HAADF-STEM对经过室温压缩和回火后 Mg-Gd,Mg-Zn 合金的孪晶界进行原子尺度的表征,在{101ˉ1}、{101ˉ2}、{101ˉ3}孪晶界面处分别发现了Gd, Zn原子的周期性偏聚。

    由于HAADF-STEM中原子柱的亮度与原子序数成正比,因而Gd和Zn的原子柱可以在孪晶界上明显观察到。Gd和Zn在孪晶界面上的周期性偏聚可有效地降低孪晶的弹性应变能,并对孪晶的运动起到钉扎作用,从而产生一定的强化作用。这一发现可以为理解六方和面心立方金属的孪晶结构、成分开拓新的视野,并为有效调控合金的成分及热处理工艺奠定基础。

    2. 原子分辨率ABF像

    ABF探测器主要是收集透射电子束和部分散射电子成像,与HAADF像中衬度与Z2成正比不同,ABF像衬度与原子序数Z1/3成正比,因而其对化学元素的变化更加敏感,尤其是轻元素。 

    如Li原子由于散射电子强度非常低,在HAADF像中通常无法观测到,而在ABF像中则可以清楚地观察到。富锂锰氧化层(LLOs,Li1+xMnyTM1-x-yO2,TM=Ni,Co,Mn,Fe 或Cr)等是锂离子电池中最具吸引力的阴极材料,但是由于Li,O原子难以观测,这种材料的结构并未研究清楚。

    6d296749f6c9d95668ae1d7718e42ec2.png

    周豪慎教授等在Angew发表的一篇文章中,通过球差校正的高分辨ABF-STEM技术对LLOs 进行观测,从原子尺度上揭示了该材料的结构。

    b6f3c314b4812e7ab87d7b2fb7ed4543.png

    图4 为LLO材料中LiTMO2结构沿[100]方向的高分辨HAADF- STEM和ABF- STEM像, HAADF像中的亮点及ABF像中的暗点对应图中过渡族金属(TM)的位置,而在ABF像中,TM原子柱夹层中微弱的暗点对应的是Li和O原子柱的位置。

    7162b8da9eb8c1b7c15b351e39ce3796.gif 高分辨率X射线能谱和电子能量损失谱元素分析方法

    1. X射线能谱分析

    从纳米尺度理解材料的化学成分对于理解材料的微观结构至关重要,而X射线能谱分析 (EDS)是电子显微分析方法一种最基本、最重要的微区成分分析方法。

    EDS主要通过检测样品与电子束相互作用激发的特征X射线的能量进行元素分析,具有探测速度快、分析元素范围广、对样品损伤小,适合分析重元素等特点,但是由于X射线的采集效率较低(仅能收集样品表面大概1%的X射线),空间分辨率不高,仅局限于定性及半定量分析

    STEM-EDS 能谱分析原理类似于TEM和SEM的能谱分析,但是其空间分辨率更高,可以进行点、线、面扫描分析。近年来,随着球差校正技术的发展及探测器采集效率的提高,获得原子分辨率的EDS元素分布图成为可能。

    4720aba9f2e9118bf8fea5edbf5ed2c3.png

    图5 超级X射线能谱探测器

    FEI 公司推出的Titan G2 Chemi STEM球差校正电镜配备超稳定的高亮度肖特基 (Schottky)FEG 源和高灵敏度的超级X能谱探测器(Super-X EDS 探测系统),该探测器采用4对称的硅漂移探测器(SDDs)(见图5)及无窗口设计,极大地提高了探测敏感度和探测速度,使得探测时间从小时变为分钟,可以在几分钟之内获得原子分辨率的二维元素分布图。

    因此,该技术有潜力解决许多材料科学中的难题,如分析原子种类的极性,界面处的元素偏聚,测量浓度低达0.01%的微量元素,描述元素的三维组成等等。

    dde21f8a146a8b47dd403228b2231606.png

    图6 SrTiO3—PbTiO3界面处EDS元素原子分布图

    图6为SrTiO3—PbTiO3 界面沿<100>方向的 EDS元素分布图,这是双钙钛矿的一种典型结构,具有铁电性、超导性及半金属性。Sr 和Pb的原子柱可以清晰地在EDS元素分布图中显现,有效地揭示了SrTiO3—PbTiO3界面的化学成分及结构。

    通过EDS面扫描可得出,Ti 的亚晶格连续地穿越界面,而Sr和Pb的亚晶格在界面处中断,同时在EDS面扫描中会发现一些元素混杂的情况,这可能是由于入射电子的漫延性及散射电子的背底较强。

    此外,JEOL公司在其JEM-ARM200F 冷场球差电镜上配置了电制冷的100 mm的EDS探测器,也可以实现原子分辨的成分像。

    f569eb8192f5a637f7f39b2f4fb75a1b.png

    图7 GaAs半导体材料的EDS元素原子分布图(a)Ga 原子分布;(b)As 原子分布;(c)Ga 与As 原子分布

    图7 为GaAs 半导体材料EDS元素原子分布图,从图中可以清晰地识别单个Ga和As原子。

    2. 电子能量损失谱分析

    在入射电子束与样品发生相互作用时,除了会产生弹性散射外,还会产生非弹性散射,使电子损失一部分能量,通过对出射电子按损失的能量进行统计记数,便可以得到电子能量损失谱(EELS)。 

    因而可以在采用环形探测器收集弹性散射电子成像的同时,通过电子能量过滤系统得到电子能量损失谱。

    通常把EELS谱分为三个部分:

    一是零损失峰,它包括未经过散射和经过完全弹性散射的透射电子以及部分能量小于1 eV的准弹性散射透射电子的贡献;

    二是低能损失区,主要包括激发等离子震荡和激发晶体内电子的带间跃迁的透射电子;

    三是高能 损失区,其中电离损失峰主要来自激发原子内壳层电子的透射电子的贡献。

    由于非弹性散射电子大都集中分布在一个顶角很小的圆锥内,探头安装合适时,EELS的接收效率很高。

    EELS在成分分析方面与X射线能谱功能相似,特别是对轻元素较为敏感,而EDS对重元素较为敏感。

    此外,电子能量损失谱的能量分辨率(约1eV)远远高于X 射线能谱的能量分辨率(约130 eV),不仅能得到样品的化学成分、电子结构、化学成键等信息, 还可以对EELS各部分选择成像。

    EELS不仅可以明显提高电子显微像与衍射图的衬度和分辨率, 而且可以提供样品中的原子尺度元素分布图,这是其他电子显微学分析无法比拟的。在STEM 中得到高分辨Z衬度像的同时,可以精确地将电子束斑停在所选的原子列上,用较大的接收光阑,就可以得到单个原子列的能量损失谱。

    原子分辨率的Z衬度像与电子能量损失谱结合,可以在亚埃的空间分辨率和亚电子伏特能量分辨率下研究材料界面和缺陷及电子结构、价态、成键和成分等,为研究材料原子尺度成分与宏观性能的关系提供新的途径。

    虽然Z衬度高分辨成像可以获得原子序数衬度, 但是它并不能确定元素的种类,EDS和EELS则是探测元素种类的有效方法,其中EELS由于具有较高的探测敏感度和可以分析电子的态密度而受到极大关注。

    d6d31f43edc1ce74e0074004baf81605.png

    图8 为Al-Mg-Si-Cu-Ag合金中Q'相的HAADF-STEM高分辨像及Cu和Ag的EELS元素面分析。

    从EELS元素面分析中可以清晰地探测到Cu和Ag元素在Q'相内的分布规律。其中Cu原子主要分布在析出相与基体的界面处,并且产生无周期的结构;而Ag原子在析出相内的分布比较分散,主要分布在非共格界面处,且Ag 原子柱在析出相内部形成一定的特定结构,Ag 原子和Cu原子不会混合排列。探究Ag及Cu原子柱在第二相内的分布情况对于理解Ag,Cu 添加对析出相形核的促进作用有重要意义。

    深入原子尺度研究物质的结构一直是人类的终极追求之一,随着透射电子显微镜及其相关部件的发展,目前配备球差校正器、单色器和高能量分辨率过滤器的FEG STEM可以在亚 埃尺度下研究材料的原子和电子结构,从而从根本上理解材料宏观性能和微观组织的关系,这对于促进固体物理、固体化学、材料科学、生命科学等领域的发展具有重要意义。

    (来源:贾志宏, 丁立鹏, 陈厚文. 高分辨扫描透射电子显微镜原理及其应用)

    对于催化、电池以及各种纳米材料研究的学者来说,除了原子尺度的表征之外,原子分子尺度的计算模拟对于深入探究材料机理起到了越来越重的作用,DFT计算已经逐渐成为顶级刊物优质工作的标配。深圳华算科技有限公司采用第一性原理计算与分子动力学、蒙特卡罗等方法相结合,对电池、催化材料进行多尺度设计与模拟,专注为海内外催化、纳米及能源领域科研人员提供材料计算模拟整体技术解决方案。方向涉及材料结构、扩散、电导率、表面吸附能/吸附位、吸附分子构型优化、催化活性能、反应路径计算、OER、HER、ORR、自由能计算等。 

    客户群体:清华、北大、天大、北理、北航、西交、华工、同济、复旦以及中科院各大院所等数十个高校院所二百多个课题组。

    客户成果:Angew. Chem. Int. Ed.、Nat. Commun.、AM、AEM、AFM、JMCA、ACS Nano、NanoEnergy、ChemSusChem等国际优质期刊。

    扫描识别下方二维码,专业团队解决您的计算模拟需求。

    2601c0ccacc6937431fc8b300775b901.png

    8ab9ba5dd61b37f10d746b9c11621aab.gif
    展开全文
  • 转自:https://xueqiu.com/9177020418/89211078读后总结:PB业务是指证券公司向专业机构投资者和高净值客户等提供集中托管清算、后台运营、研究支持、杠杆融资、证券拆借、资金募集等一站综合金融服务PB业务有望...

    转自:https://xueqiu.com/9177020418/89211078

    读后总结:

    PB业务是指证券公司向专业机构投资者和高净值客户等提供集中托管清算、后台运营、研究支持、杠杆融资、证券拆借、资金募集等一站式综合金融服务

    PB业务有望成为券商新的增长点,因为机构投资者成为市场主流,国家政策法规促进私募正规发展,产生PB业务需求。目前国内券商大部分购买外面的PB系统,有自主研发能力的只有少数几家,包括招商证券,中泰证券,华泰证券等。

    国内三大主流PB投资交易系统:恒生电子、金证股份、迅投。

    招商证券:引进国内三大主流PB投资交易系统之余,自主研发了极速专业投资交易平台,并引进以通联数据投资交易系统为代表的服务核心客户的个性化投资交易系统,完成了“1+3+N”的PB投资交易IT系统生态圈建设。

    中泰证券:开发上线了XTP极速交易平台

    比如某百亿规模私募的合伙人,就非常看重券商在IT支持服务方面的能力,这个能力包括对行情、交易、报盘等细节的熟悉程度,另有互联网背景的某私募技术合伙人,也对券商系统的响应速度、需求响应时间等有着较高的要求。这些就需要券商自身有研发交易系统的背景,才能在专业的细节问题上给予更专业的解答。在这种背景下,券商提供更高速、更个性化的交易系统和PB系统变成一项很重要的竞争手段,这也倒逼券商加强自主研发、加强IT投入、加强技术服务能力。


    能否做好PB业务,可能正成为拉开券商差距的分水岭

    过去一年,如果你身处机构行业,一定对PB业务(主经纪商业务)不会陌生。进入2017年,券商耕耘PB业务的步伐越迈越大。

    为了抢占机构客户资源,各家券商对PB业务的建设,正成为越来越多券商的一项战略业务。

    最近,券姐和朋友聊天,发现原来认识的很多老同事都转型去做PB业务了。

    从原本的前瞻性业务,到如今券商的业务蓝海,PB业务可谓魅力十足。

    机构客户青睐它,他们需要一站式的服务,需要技术平台和资金,而这些,PB系统皆能做到;券商器重它,PB能为他们带来十分可观收入,各家券商都为其倾尽心力。

    作为券商理财师的你,真的了解什么是PB业务吗?开展PB业务,需要掌握哪些技巧?

    PBPrime Brokerage)业务,即主经纪商业务,是指证券公司为专业机构投资者和高净值个人客户提供包括快速交易工具及平台、托管结算和代理支付服务、融资融券方案、绩效评估与风险管理、多账户组合管理、交易分析和流动性管理以及整合投行和资产管理的一站式金融服务。



    1

    PB业务有望成为券商新的业务增长点

    01丨国家政策支持PB业务开展

    20128月,中国证监会向证券公司下发《关于推进证券公司改革开放、创新发展的思路与措施》,明确提出鼓励证券公司开展资产托管、结算、代理等业务,为专业投资机构提供后台管理增值服务。

    创新托管体系,探索建立二级托管并存模式,提升证券公司在资本市场中的中介服务地位。

    20121228日第十一届全国人民代表大会常务委员会第十三次会议通过《中华人民共和国证券投资基金法》,将私募基金纳入了基金法,结束了私募基金长期以来处于法律上的灰色地带的处境,帮助私募基金逐步走上规范管理、合法运作的轨道。

    因此,PB业务在券商中的地位也随之提高,吸引众多大型券商试水PB业务。

    02机构投资者成为未来主流,有助于PB业务拓展

    截止20167月,基金业协会已经登记私募基金管理人16467家,已备案私募基金36829只,认缴规模7.47万亿元,实缴规模6.11万亿元,私募基金从业人员27.58万人。随着私募基金的快速发展,相关产品,例如固定收益产品和房地产,也会迎来大规模的增长。

    与散户相比,机构投资者对于券商的交易支持的要求更高,在服务内容(投资策略,衍生金融产品,资金杠杆等)方面也有较大的差异,对券商开展PB业务提出了较大的挑战。

    03PB业务收入来源广,有望成为新的利润增长点

    从国外经验来看,对冲基金因其频繁的杠杆化操作,贡献了95%左右的PB业务量。其中,约70%来自于融资利息,20%来自于交易佣金,10%来自于结构设计与定制。国内的券商PB业务收入来源主要由四部分组成:融资融券利息差、交易佣金、清算托管外包等基础服务以及种子基金的投资收益


    04种子基金促进行业发展壮大

    由于目前我国私募市场发展不规范不成熟,所以为了进一步扩大PB业务规模,多家券商设立种子基金,认购私募基金份额,目的是培育机构投资者。一方面,被认购的私募基金体现了券商对其的认可,有利于吸引更多的优质投资者;另一方面,券商既可以分享私募基金带来的收益,又可以拓展自身业务规模,提升市场影响力。


    图:  国际投行二级市场业务设置与结构

    05国家政策纠正市场违规行为,促进私募健康发展

    2015612日,证监会下发《关于加强证券公司信息系统外部接入管理的通知》,禁止证券公司为场外配资行为提供证券交易的借口。

    20157月,证监会下发《关于清理证券违法从事证券业务活动的意见》,清理开立虚拟证券账户、借用他人证券账户、出借本人证券账户和代理客户买卖证券等行为。

    2015917证监会再次下发《关于继续做好清理整顿违法从事证券业务活动的通知》,对于相关要求进行了进一步提醒。场外配资清理要求将配资结构转向券商的PB系统,原有的通过券商通道,以投顾身份下单的情况被禁止,一定程度上促进了券商PB业务的发展。

    20162月到4月,中基协发布《私募投资基金管理人内部控制指引》、《私募投资基金信息披露管理办法》、《关于进一步规范私募基金管理人登记若干事项的公告》、《私募投资基金募集行为管理办法》、《私募投资基金合同指引》等多部新规对私募基金予以规范。

    这些规范有利于私募基金的规范化运营,同时产生了大量托管和外包服务的需求,有利于PB业务的发展。

    2

    国内PB业务面临极大的改善空间

    01PB业务需要大量的投入

    大部分证券公司提供私募基金综合服务的人员由经纪条线、结算条线甚至研究条线分流而来,专业背景、从业经历较为单一,提供综合服务能力不足。部分公司信息系统建设与维护投入较少,系统多采取直接购买方式,未能根据本公司特色与客户需求持续升级,难以满足私募基金综合服务的多样化需求。

    目前只有少数几个大型券商,例如招商证券、国金证券、华泰证券和国信证券等,可以提供完善的一站式PB业务。

    02PB业务还不够系统和完善

    相比于国外超过30多年的PB业务发展历史,国内的PB业务大多还处于开疆拓土的起步期,行业内还没有规范统一的业务操作流程和模式,每个细分环节也没有统一的业务标准。部分券商对于基础服务采取低价策略打价格战,也不利于PB业务市场的长期健康发展。

    03私募基金业发展还不成熟

    我国私募基金业近两年才取得正规的法律地位,数量急速增长,国家对其的监管也还处在粗放管理的阶段,法律法规、监管体制和信用体系都存在问题,这也给券商甄别优质客户,健康发展PB业务带来了困难。所以,成熟的业务模式、完善的风控体系,丰富的运作经验都是PB业务开展的必要需求。

    3

    打造个性化PB投资交易平台,有必要吗?

    招商证券主券商业务相关负责人表示,目前券商PB业务仍然属于跑马圈地阶段,不过各家券商在该项业务上的突破口各有不同。

    有的券商依赖充足的资本金以两融为突破口,有的以产品销售为突破口,有的加强对私募机构的投研,有的则在以低价争揽托管客户等。该人士称。

    而各家券商在PB业务上寻求突破以形成差异化发展的过程中,技术驱动的行业竞争发展趋势也逐渐显现。

    目前,不少券商纷纷在PB系统方面打出自主研发牌。多家机构人士表示,通过自主研发,可以满足更加个性化的需求,也能提供更专业、及时的技术服务支持。

    如招商证券在同时引进国内三大主流PB投资交易系统之余,自主研发了极速专业投资交易平台,并引进以通联数据投资交易系统为代表的服务核心客户的个性化投资交易系统,完成了“1+3+N”PB投资交易IT系统生态圈建设。

    与此同时,中泰证券XTP极速交易平台也于近期上线。据中泰证券相关负责人介绍,前期开发过程中已与多家规模超过20亿的私募有过密切对接和需求沟通,目前已经有十多个私募用户在走上线申请流程。

    华泰证券也对其PB系统全线提速,重点提高了PB系统运行效率、客户体验、交易和风控处理速度。

    中泰证券相关业务负责人指出,PB业务客户有2个核心的需求,一是资金需求,二是交易需求。

    资金需求指的是更强的产品销售能力和更低的资金成本。而交易方面的需求指的是更专业、更个性化的交易通道,包括PB系统和交易系统等。

    他们在和很多私募人士沟通过程中发现,客户普遍具有很强的技术实力,希望券商有更专业、更个性化的面向量化投资的交易系统,同时客户在交易过程中也希望能更深入了解交易细节、业务细节。

    该人士举例道:比如某百亿规模私募的合伙人,就非常看重券商在IT支持服务方面的能力,这个能力包括对行情、交易、报盘等细节的熟悉程度,另有互联网背景的某私募技术合伙人,也对券商系统的响应速度、需求响应时间等有着较高的要求。

    这些就需要券商自身有研发交易系统的背景,才能在专业的细节问题上给予更专业的解答。

    在这种背景下,券商提供更高速、更个性化的交易系统和PB系统变成一项很重要的竞争手段,这也倒逼券商加强自主研发、加强IT投入、加强技术服务能力。

    各个部门都有自身的考核指标和业务诉求,经纪业务条线的机构部更关注私募带来的交易量,研究团队关心的是研报销售和新财富评选时的投票,证金部门关注的是杠杆融资。

    一家大型上市券商PB业务人士介绍,其所在部门运行已经长达四年时间,但在整合内部资源时依然感到难度很大。

    — END —



    作者:券业新力量
    链接:https://xueqiu.com/9177020418/89211078
    来源:雪球
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



    展开全文
  • 收集PB使用中的一些资料及技巧

    千次阅读 2011-04-09 10:19:00
    收集PB使用中的一些资料及技巧! [转]自定义事件ID含义:Event ID 含义 内容浅析单选或多选按钮消息(前缀:pbm_bm)pbm_bmgetcheck 单选按钮或多选按钮是否被选。pbm_bmgetstate 按钮是否加亮。pbm_...

    收集PB使用中的一些资料及技巧!
     
    [转]自定义事件ID含义:
    Event ID 含义 内容浅析
    单选或多选按钮消息(前缀:pbm_bm)
    pbm_bmgetcheck 单选按钮或多选按钮是否被选。
    pbm_bmgetstate 按钮是否加亮。
    pbm_bmsetcheck 将无线按钮或确认框的选中状态改为未选中状态,反之亦然。
    pbm_bmsetstate 加亮或不加亮按钮。
    pbm_bmchange 改变按钮的风格,例如,改为单选按钮或组合框。
    单选或多选按钮通知消息(前缀:pbm_bn)
    pbm_bnclicked 按钮控件被点中。
    pbm_bndisable 使按钮控件无效。
    pbm_bndoubleclicked 按钮控件被双点。
    pbm_bndragdrop 一个对象被放到按钮控件。
    pbm_bndragenter 一个对象被拖到按钮控件。
    pbm_bndragleave 一个对象被拖离按钮控件。
    pbm_bndragover 一个对象被拖经按钮控件。
    pbm_bnhilite 按钮控件被加亮。
    pbm_bnpaint 按钮控件被绘制。
    pbm_bnsetfocus 按钮控件获得聚焦。
    pbm_bnunhilite 按钮控件不被加亮。
    通用对话框消息(前缀:pbm_cb)
    pbm_cbaddstring 将字符串加到通用对话框。
    pbm_cbdeletestring 从通用对话框删除一个字符串。
    pbm_cbdir 加一个目录列表到通用对话框。
    pbm_cbfindstring 搜索以一组字符开头的字符串。
    pbm_cbfindstringexact 搜索与所提供的字符完全匹配的字符串。
    pbm_cbgetcount 列表框中的项数。
    pbm_cbgetcursel 当前被选项的数目。
    pbm_cbgetdroppedcontrolset 列表框在屏幕上的坐标位置。
    pbm_cbgeteditsel 编辑器控件中被选字符的范围。
    pbm_cbgetextendedui 缺省或扩展的用户界面。
    pbm_cbgetitemdata 重画的列表框中的4字节(32位)项。
    pbm_cbgetitemheight 列表框中某一项的高度。
    pbm_cbgetlbtext 列表框中的文本。
    pbm_cbgetlbtextlen 列表框中文本的长度。
    pbm_cbinsertstring 向列表框中增加新的字符串或4字节项。
    pbm_cblimittext 限制能被输入到列表框中的字符数。
    pbm_cbresetcontent 删除列表框中所有元素。
    pbm_cbselectstring 搜索匹配的字符串并显示。
    pbm_cbsetcursel 在列表框中选择并显示一项。
    pbm_cbseteditsel 在列表框的编辑区域中选择一块文本。
    pbm_cbsetextendedui 设置缺省或扩展的用户界面。
    pbm_cbsetitemdata 在列表框中设定4字节(32位)项。
    pbm_cbsetitemheight 设置列表框中项的高度。
    pbm_cbshowdropdown 转换(显示或隐藏)列表框中拖放区域。
    通用对话框通知消息(前缀:pbm_cbn)
    pbm_cbndblclk 用户在列表中某一项上双点。
    pbm_cbndragdrop 一个对象被放到通用对话框控件上。
    pbm_cbndragenter 一个对象被拖到通用对话框控件上。
    pbm_cbndragleave 一个对象被拖离通用对话框控件。
    pbm_cbndragover 一个对象被拖经通用对话框控件。
    pbm_cbndropdown 列表框的下放区域即将被显示。
    pbm_cbneditchange 编辑器控件中的文本发生变化。
    pbm_cbneditupdate 列表框编辑器控件中的文本即将被改变。
    pbm_cbnerrspace 列表框满,不能再向其中加入项。
    pbm_cbnkillfocus 通用列表框失去聚焦。
    pbm_cbnselchange 列表框中被选文本被改变。
    pbm_cbnselendcancel 用户按下了"取消"按钮。
    pbm_cbnselendok 用户按下了"确认"按钮。
    pbm_cbnsetfocus 通用对话控件拥有聚焦。
    数据窗口消息(前缀:pbm_dw)
    pbm_dwclosedropdown 关闭下拉式数据窗口。
    pbm_dwscrollend 在数据窗口中卷滚到最后一行。
    pbm_dwscrollhome 在数据窗口中卷滚到第一行。
    pbm_dwscrolllineend 卷滚到当前行的行尾(水平方向)。
    pbm_dwscrolllinehome 卷滚到当前行的行首(水平方向)。
    数据窗口通知消息(前缀:pbm_dwn)
    pbm_dwnbacktabout 即将通过Shift+Tab组合键离开该控件。
    pbm_dwnchanging 控件即将被改变。
    pbm_dwndropdown 下拉式列表框的下拉部分即将可见。
    pbm_dwngraphcreate 即将创建图形。
    pbm_dwnitemchangefocus 数据窗口控件中当前项的聚焦改变。
    pbm_dwnitemvalidationerror 对当前项的修改引起了一个合法性检查错误。
    pbm_dwnkey 有键被按下。使用KeyDown()处理键盘值。
    pbm_dwnlbuttondown 鼠标左键被按下。
    pbm_dwnlbuttonup 鼠标左键被松开。
    pbm_dwnmbuttonclk 鼠标中键点击。
    pbm_dwnmbuttondbclk 鼠标中键双击。
    pbm_dwnmousemove 鼠标移动。
    pbm_dwnprintmarginchange 打印边界被改变。
    pbm_dwnprocessenter 回车键被按下。
    pbm_dwnrowchange 数据窗口中聚焦从一行转向另一行。
    pbm_dwntabdownout 用户在数据窗口最后一行按了下箭头键。
    pbm_dwntabout 用户在数据窗口的最后一行/列中按了tab键。
    pbm_dwntabupout 用户在数据窗口第一行中按了上箭头键。
    动态数据交换(DDE)消息(前缀:pbm_dde)
    pbm_ddeddeack 收到一个DDE消息。
    pbm_ddeddeinitiate 开始一个DDE会话。
    pbm_ddeddeterminate 终止一个DDE会话。
    编辑器控件消息(前缀:pbm_em)
    pbm_emcanundo 编辑器控件是否能撤消上一次修改。
    pbm_ememptyundobuffer 清空由Windows管理的取消操作的缓冲区。
    pbm_emfmtlines 在多行编辑器控件的行尾增加或删除回车换行。
    pbm_emgetfirstvisibleline 返回编辑器控件中可见的第一行的行号。
    pbm_emgethandle 获得编辑器控件使用的内存句柄。
    pbm_emgetline 从编辑器控件中复制一行到内存中的一个缓冲区。
    pbm_emgetlinecount 返回多行编辑器控件的行数。
    pbm_emgetmodify 文本是否被用户修改。
    pbm_emgetrect 返回控件的长方形域。
    pbm_emgetsel 返回被选文本的起始位置。
    pbm_emlimittext 限制用户键入的文本长度。
    pbm_emlinefromchar 返回被选文本的行号。
    pbm_emlineindex 返回编辑器控件中被选行第一个字符在编辑串中的位置。
    pbm_emlinelength 返回编辑器控件中被选行中的字符数。
    pbm_emlinescroll 水平或垂直卷滚编辑器控件。
    pbm_emreplacesel 从剪贴板或从键盘上用新文本替换被选文本。
    pbm_emsethandle 设置编辑器控件的句柄指向内存中的一个缓冲区。
    pbm_emsetmodify 设置编辑器控件的modified标志。
    pbm_emsetpasswordchar 设置用户输入任何文本时显示的字符,在输入密码时的显示。
    pbm_emsetrect 设置/重置编辑器控件所在的长方形区域,编辑器控件中的文本被重画。
    pbm_emsetrectnp 除了不重画文本,大致与setrect相同。
    pbm_emsetsel 选择字符。
    pbm_emsettabstops 在多行编辑器控件中设置tabstops。
    pbm_emsetwordbreak 设置新的词拆分函数。
    pbm_emsetwordbreakproc 设置新的词拆分过程。
    pbm_emundo 撤消最近的编辑操作。
    编辑控件通知消息(前缀:pbm_en)
    pbm_enchange 编辑器控件中的文本发生改变。
    pbm_enerrspace 编辑器控件内存缓冲区溢出。
    pbm_enhscroll 用户点中上水平卷滚条。
    pbm_enmaxtext 用户试图输入比允许更多的文本。
    pbm_enupdate 编辑器控件即将显示用户的修改。
    pbm_envscroll 用户点中了垂直卷滚条。
    列表框消息(前缀:pbm_lb)
    pbm_lbaddstring 向列表框控件中增加一项或一个字符串。
    pbm_lbdeletestring 从列表框中删除一项或一个字符串。
    pbm_lbdir 用目录列表填充列表框。
    pbm_lbfindstring 在列表框中搜索与所给字符串部分匹配的第一项。
    pbm_lbfindstringexact 在列表框中搜索与所给字符串精确匹配的第一项。
    pbm_lbgetcaretindex 在列表框中搜索拥有聚焦的项。
    pbm_lbgetcount 确定列表框中的项数。
    pbm_lbgetcursel 确定所选项是第几项。
    pbm_lbgethorizontalextent 获得列表框的宽度、计算水平卷滚。
    pbm_lbgetitemheight 确定列表框控件中项的高度。
    pbm_lbgetitemrect 确定列表框的尺寸。
    pbm_lbgetsel 获得列表框中当前所选的项。
    pbm_lbgetselcount 在多选列表框中获得所选项的数目。
    pbm_lbgetselitems 用列表框中表框各自的项号填充一个给定的整数数组。
    pbm_lbgettext 获得列表框中当前所选项的文本。
    pbm_lbgettextlen 获得列表框中当前所选项的文本中的字符数。
    pbm_lbgettopindex 确定列表框中可见的最上面一项的项号。
    pbm_lbinsertstring 向列表框中加入一个新字符串。
    pbm_lbresetcontent 重置(消除)列表框中的内容。
    pbm_lbselectstring 搜索并加亮与所给字符匹配的字符串。
    pbm_lbselitemrange 选择/取消列表框中某一范围中的项。
    pbm_lbsetcaretindex 设置列表框中的某一项拥有聚焦。
    pbm_lbsetcolumnwidth 设置列表框中列的宽度。
    pbm_lbsetcursel 在列表框中选择并加亮一项;如果需要,卷滚到列表框。
    pbm_lbsethorizontaltext 设置列表框中被水平卷滚的单元数。
    pbm_lbsetitemdata 设置与列表框相关的32位/4字节值。
    pbm_lbsetitemheight 设置列表框中项的高度。
    pbm_lbsetsel 在列表框中选择一个字符串。
    pbm_lbsettabstops 设置列表框控件中tabstops的位置。
    pbm_lbsettopindex 卷滚列表框使特定的项成为可见的最上面一项。
    列表框通知消息(前缀:pbm_en) 
    pbm_endblclk 用户在列表框控件中的某一项上双击。
    pbm_enerrspace 用户试图超越可在列表框中输入字符的最大限制。
    pbm_enselcancel 当前选取文本被取消。
    pbm_enselchange 用户在列表框中选择或取消了一项。
     
    窗口消息(前缀:pbm_)
    pbm_activateapp 被激活的窗口属于另外一个应用。
    pbm_askcbformatname 要求剪贴板中的内容被复制到一个使用自定义格式的文本缓冲区中。
    pbm_char 传送键盘上按下的键。
    pbm_chartoitem 通过转换键盘来的字符,帮助列表框定位其中的项。
    pbm_childactivate 一个子窗口被移动或激活。
    pbm_clear 用户要删除当前编辑器控件中的内容。
    pbm_command 用户选择了一个菜单项、控件,或使用了加速键。
    pbm_compacting 系统内存资源不足;当Windows占用了多于1/8的CPU时间紧缩内存时,产生这条消息。
    pbm_compareitem 当新的一项被加入列表框或组合框时产生此消息,Window用这条消息进行项之间的比较。
    pbm_ctlcolor 一个控件即将被画出,可在此时改变控件的颜色。
    pbm_deadchar 用户选择了一种非英语字符集或其它特殊字符集,这将改变下面将要输入的字符。
    pbm_deleteitem 从列表框或通用对话框中移去一项。
    pbm_destroyclipboard 剪贴板内容被清除。
    pbm_devmodechanged WIN.INI中的一个设备名被修改。
    pbm_drawclipboard 剪贴板内容发生改变。
    pbm_drawitem 列表框或通用对话框的一项内容被改变。
    pbm_dropfiles 当鼠标左键在一个注册为拖放文件接受器的应用上释放时,发出该消息。
    pbm_erasebkgnd 窗口的客户区需要重画。
    pbm_fontchange 应用可用的字体数改变。
    pbm_getdlgcode 通知消息,说明当前使用哪种类型的键盘。
    pbm_getfont 获取当前激活的字体。
    pbm_getminmaxinto Windows正在检查最小化或最大化窗口的尺寸。
    pbm_gettext 从一个控件(如按钮或编辑器控件)中复制文本到一个内存缓冲区。
    pbm_gettextlength 用来确定一个控件中的字符数。
    pbm_hscrollclipboard 剪贴板的水平卷滚条被使用。
    pbm_iconerasebkgnd 一个最小化窗口需要重化背景。
    pbm_initdialog 一个对话框即将被显示。
    pbm_initmenu 一个菜单即将被显示。
    pbm_initmenupopup 一个弹出式窗口即将被显示。
    pbm_keydown 键盘上的一个键被按下。
    pbm_keyup 键盘上的一个键被释放。
    pbm_mdiactive 一个MDI子窗口(表单)被激活。
    pbm_mdicascade 以重叠的形式重排所有的表单。
    pbm_mdicreate 创建一个表单。
    pbm_mdidestroy 从MDI框架中移去一个表单。
    pbm_mdigetactive 获得当前活动的MDI表单的句柄。
    pbm_mdiiconrange 在一个MDI框架中重排最小化表单的图标。
    pbm_mdimaximize 最大化一个MDI子表单。
    pbm_mdinext 激活下一个MDI表单(紧接着活动表单的表单)。
    pbm_mdirestore 把MDI表单恢复到它原来的大小。
    pbm_mdisetmenu 将一个菜单与一个MDI表单联系起来。
    pbm_mdifitle 平铺所有的MDI表单。
    pbm_measureitem 这个消息被送给即将创建的、内有按钮或其它控件的窗口。
    pbm_menuchar 用户使用了一个快捷键,但系统不支持该快捷键。
    pbm_menuselect 用户选择了一个菜单项。
    pbm_mouseactivate 用户在一个非活动窗口中点击了鼠标。
    pbm_mousemove 用户移动了鼠标。
    pbm_ncactivate 窗口的非客户区即将被激活。
    pbm_nccalcsize 窗口的尺寸需要重新计算。
    pbm_nccreate 窗口即将创建它的非客户区。
    pbm_ncdestroy 窗口的非共享区被析构。
    pbm_nchittest 每次非客户区被移动时都发送该消息。
    pbm_nclbuttondblclk 用户在非客户区双点了鼠标左键。
    pbm_ncpaint 非客户需要画出。
    pbm_nextdlgctl 在对话框中将聚焦转给另一个控件。
    pbm_paint 窗口的客户区需要被画出。
    pbm_paintclipboard 剪贴板应用有剪贴操作,剪贴板查看器需重画。
    pbm_palettechanged 系统调色板被改变。
    pbm_paletteischanging 系统调色板即将被改变。
    pbm_parentnotify 通知父窗口一个子窗口即将被创建。
    pbm_querydragicon 用户要拖一个最小化窗口。
    pbm_queryendsession 通知消息,说明窗口即将被关闭。
    pbm_querynewpalette 应用即将收到输入聚焦,应该执行必要的颜色调整。
    pbm_queryopen 一个最小化窗口即将被恢复。
    pbm_quit 应用处理的最后一个消息。
    pbm_renderallformats 通知一个剪贴板格式的拥有者,应用将失去所有的格式。
    pbm_renderformats 通知消息,说明放在剪贴板中的数据应该用一种特殊格式传送。
    pbm_setcursor 通知消息,说明鼠标指针在一个窗口中移动。
    pbm_setfont 用来在对话框中改变字体。
    pbm_setredraw 在加一个新项之前发送给列表框或通用对话框。
    pbm_settext 用来改变窗口的标题或文本。
    pbm_sizeclipboard 剪贴板查看器应用改变尺寸。
    pbm_spoolerstatus 一个打印管理器任务被添加或删除。
    pbm_syschar <ALT>键和其它某键同时被按下。
    pbm_syscolorchange 一种或多种系统颜色被改变。
    pbm_syscommand 用户选择了一个系统菜单命令。
    pbm_sysdeadchar 通知消息,说明一种非英语字符集被选定。
    pbm_syskeydown 用户按下某键的同时按下了<ALT>键。
    pbm_syskeyup 用户释放了<ALT>组合键。
    pbm_timechange 系统时钟被修改。
    pbm_undo 从undo缓冲区复制文本到编辑器控件。
    pbm_vkeytoitem 当一个列表框拥有聚焦时,用户按下了一个键。
    pbm_vscroll 用户点击了垂直卷滚条。
    pbm_vscrollclipboard 剪贴板查看器的垂直卷滚条被点击。
    pbm_windowposchanged 窗口位置发生改变。
    pbm_windowposchanging 窗口位置即将发生改变。
    pbm_wininichange WIN.INI文件被修改。
     
     [转]SHELL 命令
    1.命令: rundll32.exe shell32.dll,Control_RunDLL
    功能: 显示控制面板
    2.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1
     功能: 显示“控制面板->辅助选项->键盘”选项视窗
     
    3.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2
     功能: 显示“控制面板->辅助选项->声音”选项视窗
     
    4.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3
     功能: 显示“控制面板->辅助选项->显示”选项视窗
     
    5.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4
     功能: 显示“控制面板->辅助选项->鼠标”选项视窗
     
    6.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5
     功能: 显示“控制面板->辅助选项->常规”选项视窗
     
    7.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1
     功能: 执行“控制面板->添加新硬件”向导。
     
    8.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter
     功能: 执行“控制面板->添加新打印机”向导。
     
    9.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1
     功能: 显示 “控制面板->添加/删除程序->安装/卸载” 面板。
     
    10.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2
      功能: 显示 “控制面板->添加/删除程序->安装Windows” 面板。
     
    11.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,3
     功能: 显示 “控制面板->添加/删除程序->启动盘” 面板。
     
    12.命令: rundll32.exe syncui.dll,Briefcase_Create
      功能: 在桌面上建立一个新的“我的公文包”。
     
    13.命令: rundll32.exe diskcopy.dll,DiskCopyRunDll
      功能: 显示复制软盘视窗
     
    14.命令: rundll32.exe apwiz.cpl,NewLinkHere %1
      功能: 显示“建立快捷方式”的对话框,所建立的快捷方式的位置由%1参数决定。
     
    15.命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,0
      功能: 显示“日期与时间”选项视窗。
     
    16.命令: rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,,1
      功能: 显示“时区”选项视窗。
     
    17.命令: rundll32.exe rnaui.dll,RnaDial [某个拨号连接的名称]
      功能: 显示某个拨号连接的拨号视窗。如果已经拨号连接,则显示目前的连接状态的视窗。
     
    18.命令: rundll32.exe rnaui.dll,RnaWizard
      功能: 显示“新建拨号连接”向导的视窗。
     
    19.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0
      功能: 显示“显示属性->背景”选项视窗。
     
    20.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1
      功能: 显示“显示属性->屏幕保护”选项视窗。
     
    21.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2
      功能: 显示“显示属性->外观”选项视窗。
     
    22.命令: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3
      功能: 显示显示“显示属性->属性”选项视窗。
     
    23.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL FontsFolder
      功能: 显示Windows的“字体”文件夹。
     
    24.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
      功能: 同样是显示Windows的“字体”文件夹。
     
    25.命令: rundll32.exe shell32.dll,SHformatDrive
      功能: 显示格式化软盘的对话框。
     
    26.命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,0
      功能: 显示“控制面板->游戏控制器->常规”选项视窗。
     
    27.命令: rundll32.exe shell32.dll,Control_RunDLL joy.cpl,,1
      功能: 显示“控制面板->游戏控制器->高级”选项视窗。
     
    28.命令: rundll32.exe mshtml.dll,PrintHTML (HTML文档)
      功能: 打印HTML文档。
     
    29.命令: rundll32.exe shell32.dll,Control_RunDLL mlcfg32.cpl
      功能: 显示Microsoft Exchange常规选项视窗。
     
    30.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @0
      功能: 显示“控制面板->鼠标” 选项 。
     
    31.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1
      功能: 显示 “控制面板->键盘属性->速度”选项视窗。
     
    32.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @1,,1
      功能: 显示 “控制面板->键盘属性->语言”选项视窗。
     
    33.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @2
      功能: 显示Windows“打印机”文件夹。
     
    34.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @3
      功能: 显示Windows“字体”文件夹。
     
    35.命令: rundll32.exe shell32.dll,Control_RunDLL main.cpl @4
     功能: 显示“控制面板->输入法属性->输入法”选项视窗。
     
    36.命令: rundll32.exe shell32.dll,Control_RunDLL modem.cpl,,add
     功能: 执行“添加新调制解调器”向导。
     
    37.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,0
      功能: 显示“控制面板->多媒体属性->音频”属性页。
     
    38.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,1
      功能: 显示“控制面板->多媒体属性->视频”属性页。
     
    39.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,2
      功能: 显示“控制面板->多媒体属性->MIDI”属性页。
     
    40.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,3
      功能: 显示“控制面板->多媒体属性->CD音乐”属性页。
     
    41.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,4
      功能: 显示“控制面板->多媒体属性->设备”属性页。
     
    42.命令: rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl @1
      功能: 显示“控制面板->声音”选项视窗。
     
    43.命令: rundll32.exe shell32.dll,Control_RunDLL netcpl.cpl
      功能: 显示“控制面板->网络”选项视窗。
     
    44.命令: rundll32.exe shell32.dll,Control_RunDLL odbccp32.cpl
      功能: 显示ODBC32资料管理选项视窗。
     
    45.命令: rundll32.exe shell32.dll,OpenAs_RunDLL {drive:/path/filename}
      功能: 显示指定文件(drive:/path/filename)的“打开方式”对话框。
     
    46.命令: rundll32.exe shell32.dll,Control_RunDLL password.cpl
      功能: 显示“控制面板->密码”选项视窗。
     
    47.命令: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
      功能: 显示“控制面板->电源管理属性”选项视窗。
     
    48.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL PrintersFolder
      功能: 显示Windows“打印机”文件夹。(同rundll32.exe shell32.dll,Control_RunDLL main.cpl @2)
     
    49.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,0
      功能: 显示“控制面板->区域设置属性->区域设置”选项视窗。
     
    50.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,1
      功能: 显示“控制面板->区域设置属性->数字”选项视窗。
     
    51.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,2
      功能: 显示“控制面板->区域设置属性->货币”选项视窗。
     
    52.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,3
      功能: 显示“控制面板->区域设置属性->时间”选项视窗。
     
    53.命令: rundll32.exe shell32.dll,Control_RunDLL intl.cpl,,4
      功能: 显示“控制面板->区域设置属性->日期”选项视窗。
     
    54.命令: rundll32.exe desk.cpl,InstallScreenSaver [屏幕保护档案名]
      功能: 将指定的屏幕保护文件设置为Windows的屏保,并显示屏幕保护属性视窗。
     
    55.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,0
      功能: 显示“控制面板->系统属性->传统”属性视窗。
     
    56.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,1
      功能: 显示“控制面板->系统属性->设备管理器”属性视窗。
     
    57.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,2
      功能: 显示“控制面板->系统属性->硬件配置文件”属性视窗。
     
    58.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl,,3
      功能: 显示“控制面板->系统属性->性能”属性视窗。
     
    59.命令: rundll32.exe user.exe,restartwindows
      功能: 强行关闭所有程式并重启机器。
     
    60.命令: rundll32.exe user.exe,exitwindows
      功能: 强行关闭所有程式并关机。
     
    61.命令: rundll32.exe shell32.dll,Control_RunDLL telephon.cpl
      功能: 显示“拨号属性”选项视窗。。
     
    62.命令: rundll32.exe shell32.dll,Control_RunDLL themes.cpl
      功能: 显示“桌面主题”选项面板。
     
    转:如何提高SQL语言的查询效率?
     
    由于SQL是面向结果而不是面向过程的查询语言,所以一般支持SQL语言的大型关系型数据库都使用一个基于查询成本的优化器,为即时查询提供一个最佳的执行策略。对于优化器,输入是一条查询语句,输出是一个执行策略。
        一条SQL查询语句可以有多种执行策略,优化器将估计出全部执行方法中所需时间最少的所谓成本最低的那一种方法。所有优化都是基于用记所使用的查询语句中的where子句,优化器对where子句中的优化主要用搜索参数(Serach Argument)。
     
        搜索参数的核心思想就是数据库使用表中字段的索引来查询数据,而不必直接查询记录中的数据。
     
        带有 =、<、<=、>、>= 等操作符的条件语句可以直接使用索引,如下列是搜索参数:
        emp_id = "10001" 或 salary > 3000 或 a =1 and c = 7
     
        而下列则不是搜索参数:
        salary = emp_salary 或 dep_id != 10 或 salary * 12 >= 3000 或 a=1 or c=7
     
        应当尽可能提供一些冗余的搜索参数,使优化器有更多的选择余地。请看以下3种方法:
     
        第一种方法:
        select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (department.dep_code='01') and (employee.dep_code='01');
     
        它的搜索分析结果如下:
        Estimate 2 I/O operations
        Scan department using primary key
        for rows where dep_code equals '01'
        Estimate getting here 1 times
        Scan employee sequentially
        Estimate getting here 5 times
     
        第二种方法:
        select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (department.dep_code='01');
     
        它的搜索分析结果如下:
        Estimate 2 I/O operations
        Scan department using primary key
        for rows where dep_code equals '01'
        Estimate getting here 1 times
        Scan employee sequentially
        Estimate getting here 5 times
     
        第一种方法与第二种运行效率相同,但第一种方法最好,因为它为优化器提供了更多的选择机会。
     
        第三种方法:
        select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (employee.dep_code='01');
     
        这种方法最不好,因为它无法使用索引,也就是无法优化……
     
    使用SQL语句时应注意以下几点:
     
        1、避免使用不兼容的数据类型。例如,Float和Integer,Char和Varchar,Binary和Long Binary不兼容的。数据类型的不兼容可能使优化器无法执行一些本可以进行的优化操作。例如:
     
        select emp_name form employee where salary > 3000;
     
        在此语句中若salary是Float类型的,则优化器很难对其进行优化,因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。
     
        2、尽量不要使用表达式,因它在编绎时是无法得到的,所以SQL只能使用其平均密度来估计将要命中的记录数。
     
        3、避免对搜索参数使用其他的数学操作符。如:
     
           select emp_name from employee where salary * 12 > 3000;
     
           应改为:
     
           select emp_name from employee where salary > 250;
     
        4、避免使用 != 或 <> 等这样的操作符,因为它会使系统无法使用索引,而只能直接搜索表中的数据。
     
     
    转:键码常数值描述
     
    vbKeyLButton 1 鼠标左键
    vbKeyRButton 2 鼠标右键
    vbKeyCancel 3 CANCEL 键
    vbKeyMButton 4 鼠标中键
    vbKeyBack 8 BACKSPACE 键
    vbKeyTab 9 TAB 键
    vbKeyClear 12 CLEAR 键
    vbKeyReturn 13 ENTER 键
    vbKeyShift 16 SHIFT 键
    vbKeyControl 17 CTRL 键
    vbKeyMenu 18 菜单键
    vbKeyPause 19 PAUSE 键
    vbKeyCapital 20 CAPS LOCK 键
    vbKeyEscape 27 ESC 键
    vbKeySpace 32 SPACEBAR 键
    vbKeyPageUp 33 PAGEUP 键
    vbKeyPageDown 34 PAGEDOWN 键
    vbKeyEnd 35 END 键
    vbKeyHome 36 HOME 键
    vbKeyLeft 37 LEFT ARROW 键
    vbKeyUp 38 UP ARROW 键
    vbKeyRight 39 RIGHT ARROW 键
    vbKeyDown 40 DOWN ARROW 键
    vbKeySelect 41 SELECT 键
    vbKeyPrint 42 PRINT SCREEN 键
    vbKeyExecute 43 EXECUTE 键
    vbKeySnapshot 44 SNAP SHOT 键
    vbKeyInser 45 INS 键
    vbKeyDelete 46 DEL 键
    vbKeyHelp 47 HELP 键
    vbKeyNumlock 144 NUM LOCK 键
     
     
    A 键到 Z 键与其 ASCII 码的相应值'A' 到 'Z' 是一致的
    常数 值 描述
    vbKeyA 65 A 键
    vbKeyB 66 B 键
    vbKeyC 67 C 键
    vbKeyD 68 D 键
    vbKeyE 69 E 键
    vbKeyF 70 F 键
    vbKeyG 71 G 键
    vbKeyH 72 H 键
    vbKeyI 73 I 键
    vbKeyJ 74 J 键
    vbKeyK 75 K 键
    vbKeyL 76 L 键
    vbKeyM 77 M 键
    vbKeyN 78 N 键
    vbKeyO 79 O 键
    vbKeyP 80 P 键
    vbKeyQ 81 Q 键
    vbKeyR 82 R 键
    vbKeyS 83 S 键
    vbKeyT 84 T 键
    vbKeyU 85 U 键
    vbKeyV 86 V 键
    vbKeyW 87 W 键
    vbKeyX 88 X 键
    vbKeyY 89 Y 键
    vbKeyZ 90 Z 键
     
     
    0 键到 9 键与其 ASCII 码的相应值 '0' 到 '9' 是一致的
    常数 值 描述
    vbKey0 48 0 键
    vbKey1 49 1 键
    vbKey2 50 2 键
    vbKey3 51 3 键
    vbKey4 52 4 键
    vbKey5 53 5 键
    vbKey6 54 6 键
    vbKey7 55 7 键
    vbKey8 56 8 键
    vbKey9 57 9 键
     
     
    数字小键盘上的键
    常数 值 描述
    vbKeyNumpad0 96 0 键
    vbKeyNumpad1 97 1 键
    vbKeyNumpad2 98 2 键
    vbKeyNumpad3 99 3 键
    vbKeyNumpad4 100 4 键
    vbKeyNumpad5 101 5 键
    vbKeyNumpad6 102 6 键
    vbKeyNumpad7 103 7 键
    vbKeyNumpad8 104 8 键
    vbKeyNumpad9 105 9 键
    vbKeyMultiply 106 乘号 (*) 键
    vbKeyAdd 107 加号 (+) 键
    vbKeySeparator 108 ENTER 键(在数字小键盘上)
    vbKeySubtract 109 减号 (-) 键
    vbKeyDecimal 110 小数点 (.) 键
    vbKeyDivide 111 除号 (/) 键
     
     
    功能键
    常数 值 描述
    vbKeyF1 112 F1 键
    vbKeyF2 113 F2 键
    vbKeyF3 114 F3 键
    vbKeyF4 115 F4 键
    vbKeyF5 116 F5 键
    vbKeyF6 117 F6 键
    vbKeyF7 118 F7 键
    vbKeyF8 119 F8 键
    vbKeyF9 120 F9 键
    vbKeyF10 121 F10 键
    vbKeyF11 122 F11 键
    vbKeyF12 123 F12 键
    vbKeyF13 124 F13 键
    vbKeyF14 125 F14 键
    vbKeyF15 126 F15 键
    vbKeyF16 127 F16 键
     
    PowerBuilder 7.0 运行库文件
     
    File Name Purpose   Runtime Development
    PBADD70.DLL Utilities (Profiler, DWSyntax, etc) No Yes
    PBAPL70.DLL Application Painter & Project Painter No Yes
    PBCGB70.DLL Code Generation 1 No Yes
    PBCGC70.DLL Code Generation Compiler 1 No Yes
    PBCGL70.DLL Code Generation Linker 1 No Yes
    PBCGR70.DLL Code Generation Resource Compiler 1 No Yes
    PBCGS70.DLL Code Generation 1 No Yes
    PBCH70.DLL Machine code generation No Yes
    PBCMP70.DLL Compiler No Yes
    PBCOM70.DLL COM Generator No Yes
    PBCPP70.DLL C++ Generator No Yes
    PBDEV70.DLL Shared Development Utilities No Yes
    PBDIR70.DLL DirectConnect Database Driver Optional Optional
    PBDPP70.DLL Pipeline Painter No Yes
    PBDTS70.DLL Table/Database Painter No Yes
    PBDWE70.DLL DataWindow Engine Yes Yes
    PBDWO70.DLL DataWindow Objects for Painters No Yes
    PBDWP70.DLL DataWindow Painter No Yes
    PBDWR70.DLL HTML DataWindow Optional No
    PBGEN70.DLL Application Template No Yes
    PBIN770.DLL Informix 7 Database Driver Optional Optional
    PBIN970.DLL Informix 9 Database Driver Optional Optional
    PBISA70.DLL MS Internet InfoServices API Optional No
    PBJAG70.DLL Jaguar Interfaces – required on server Optional No
    PBJCG70.DLL Jaguar Interfaces No Yes
    PBJDC70.DLL Jaguar Interfaces No Yes
    PBJDM70.DLL Microsoft JDBC Database Driver Optional Optional
    PBJDS70.DLL Sun JDBC Database Driver Optional Optional
    PBJPG70.DLL Jaguar Component Generator No Yes
    PBJPX70.DLL Jaguar Proxy Generator No Yes
    PBLIB70.DLL Library Painter No Yes
    PBMSS70.DLL Microsoft SQLServer Database Driver Optional Optional
    PBNS170.DLL WEB.PB Netscape API Version 1 Optional No
    PBNS270.DLL WEB.PB Netscape API Version 2 Optional No
    PBNS370.DLL WEB.PB Netscape API Version 3 Optional No
    PBO7370.DLL Oracle 7.3 Database Driver Optional Optional
    PBO8470.DLL Oracle 8.04 Database Driver Optional Optional
    PBODB70.DLL ODBC Database Driver Optional Optional
    File Name Purpose Runtime Development
    PBOGR70.DLL Registry Utility No Yes
    PBOLE70.DLL OLE DB Database Driver Optional Optional
    PBOR870.DLL Oracle 8 Database Driver Optional Optional
    PBORC70.DLL ORCA interface No No
    PBPRX70.DLL Proxy Generator No Yes
    PBRTC70.DLL Rich Text Control Optional Yes
    PBSCC70.DLL SCC Source Control Driver No Optional
    PBSCR70.DLL Script Painter & Debugger No Yes
    PBSQL70.DLL SQL Painter & Query Painter No Yes
    PBSYC70.DLL Sybase ASE Database Driver Optional Optional
    PBSYD70.DLL UNIX Sybase Database Driver Optional Optional
    PBSYJ70.DLL Jaguar Sybase ASE Database Driver Optional No
    PBSYS70.DLL System Utility No Yes
    PBTRA70.DLL Database Trace Utility (pbtrace.log) Optional Optional
    PBUDO70.DLL User Object Painter & Menu Painter No Yes
    PBVM70.DLL Virtual Machine Yes Yes
    PBWED70.DLL Script Editor 2 No Yes
    PBWEI70.DLL Script Editor 2 No Yes
    PBWEP70.DLL Script Editor 2 No Yes
    PBWES70.DLL Script Editor 2 No Yes
    PBWIZ70.DLL Start Wizards No Yes
    PBWPB70.DLL Web PB Wizard No Yes
    PSDWC70.CAB DataWindow Web ActiveX Optional No
     
     
     
     
    pbapl70.dll 应用画笔
    pbbgr70.dl 商业图形引擎
    pbcgc70.dll 编译代码
    pbcgl.dll 链接代码
    pbcgr.dll资源编译
    pbch70.dll 头文件
    pbcmp70.dll powerscript编译器
    pbctl70.dll 窗口/报表和用户自定义对象画板
    pbdpp70.dll 分布式powerbuilder
    pbdts70.dll 数据库画板工具
    pbdwe70.dll 数据窗口引擎
    pbdwo70.dll 数据窗口对话框
    pbdwp70.dll 数据窗口画板
    pbgen70.dll 应用模板
    pbin970.dll informix 数据库接口
    pblib70.dll 库画板和浏览器
    pbmss70.dll ms sql server数据库接口
    pbodb70.dll odbc数据库接口
    pborc70.dll orcle数据库接口
    pbrtc70.dll rtf支持软件
    pbscr70.dll script画板
    pbsql70.dll sql画板
    pbsyc70.dll sybase数据库接口
    pbsys70.dll 开发系统
    pbtra70.dll 数据库接口
    pbudo70.dll 用户对象画板
    pbwed70.dll 编辑器
    pbwei70.dll 编辑器的自动缩进
    pbwep70.dll 编辑器的powerscript颜色 
    pbwes70.dll 编辑器的sql颜色
     
     
    在PB中用OLE存取blob类型数据
     
    --------------------------------------------------------------------------------
     
      前言:在数据库的开发过程中,经常需要在数据库中存储一些备注信息,而这些备注信息的内容一般较大,格式多样-如有可能是语音文件、视频文件、图片文件、文本文件等,怎样在PB中实现这些格式不同的备注文件的存取及预览,一直是PB开发人员比较关心的一个问题,本文系统的介绍了三种存取备注二进制信息的方法。
     
      对备注二进制信息的存储可以采用以下三种方式;
      方法一:文件保存在固定的路径下,数据库中存取文件路径和名称
     
      方法二:数据库中用blob类型或者varbinary类型字段存储备注文件
     
      方法三:在本地用OLE存储结构存储备注文件
     
    1、OLE的基本概念
     
    OLE是Object Linking Embedding(对象链结与嵌入)的缩写,它可以使windows应用程序共享数据和程序。
     
    2、OLE控件
     
      在PB中OLE控件是一个OLE对象的包容器,可以使用服务器应用程序提供的功能和命令来编辑对象,也可以使用自动化OLE交互,在程序中激活对象和向服务器应用程序发送命令;在PB 的window画板中的OLE控件允许用户从多个应用程序嵌入和链结组件
     
      2.1建立和设置OLE控件
     
      从window画板中选择OLE控件插入window。
     
      当建立一个OLE控件并且插入一个对象时,PB将激活服务器应用程序以允许对对象进行编辑和修改;在使OLE中的对象称为非活动状态后,可以使用控件属性选项卡来设置控件的属性。
     
      2.2 激活修改window画板中的OLE对象
     
      在OLE控件的弹出菜单中选择open可以激活画板中OLE对象
     
      使用服务器应用程序修改OLE对象
     
      结束修改:使对象恢复为非活动状态,只要单击服务器应用对象之外的任何区域即可,也可以直接关闭服务器应用程序的窗口。
     
      2.3 嵌入和链结OLE控件
     
      可以将OLE对象嵌入或者链结到自己的应用程序中。嵌入对象的数据放在应用程序中,在开发过程中这些数据放在应用程序的PBl库中,当生成应用后,这些数据将存放在exe或PBd文件中,虽然在程序的运行过程中可以修改,但修改的数据不会保存;链结对象的数据存放在PB应用程序以外,当链结一个对象时,在PB应用程序中不存放数据文件,而是存放引用数据的指针, 使用链结的数据,对数据的管理和保存都由服务器应用程序负责。这样可以用服务器应用程序修改处理数据,处理后的数据可以保存回原文件中。链结方式应用于需要多个应用程序共享的数据文件,任何一个应用程序修改了数据文件,都将影响到所有链结该文件的应用程序。
     
      2.4 OLE控件的激活方式
     
      OLE控件的激活方式有offsite和in-place两种激活方式,offsite激活方式是指在PB应用程序的界面以外单独打开OLE对象,in-place激活方式是指PB应用程序的界面的原位置打开OLE对象。在数据窗口中的dbOLE默认的是offsite激活方式,而window中的OLE默认的激活方式是in-place。
     
      在PB应用程序中可以用命令
     
      OLE_control.active(offsite) 或者OLE_control.active(in-place)设置OLE对象的以何种方式打开。
     
      2.5 设置和插入OLE对象
     
      在程序运行时可以用函数:
     
      OLE_control.insertfile(soucefile) 插入对象
     
      OLE_control.objectdata = blobvar 设置对象
     
    3、OLE存储
     
      3.1 OLE存储(OLEstorage)的概念
     
      OLE存储(OLEstorage)是OLE数据的一个仓库,存储就象磁盘上的目录结构,它可以是一个OLE对象,也可以包含在OLE对象中,每个对象都包含在OLE存储或者存储内的子存储内。保存在OLE存储中数据称作OLE流(OLE stream),OLE流同OLE对象的关系就象文件同目录的关系。含有OLE对象的存储或子存储可以看做是属于特殊服务器的信息,在该层次之下的各部分都可以被相应的服务器程序操作。OLE存储对象是类用户对象,可以说明相应类型的变量,建立与之相应的实例和打开存储等,在使用完存储后需要关闭存储、释放分配的内存。
     
      3.2 OLE存储的打开和保存
     
      OLE存储可以用open函数打开,open函数的格式为:
     
      Olecontrol.Open(OLEsourcefile),
     
      此函数在OLEsourcefile不存在时,自动创建该文件,所以创建OLE文件也用该函数; OLE存储可以用save函数保存,save函数的格式为:
     
      OLEcontrol.save() // 保存OLE控件
     
      OLEstorage.save() //保存OLE存储
     
      4、处理blob类型数据
     
       对于大二进制数据,在PB Script中是用blob数据类型表示并加以处理。标准SQL语句中的select、insert和update语句无法直接查询blob类型的数据,在PB中操作blob类型的数据只能用专用的语句,从数据库中查询blob类型的数据的命令是:
     
       selectblob restofselectstatement {using transactionobject};
     
       更新数据库中blob类型数据的格式是:
     
       updateblob tablename
     
       set blobcolumn = blobvarible  
     
       restofupatestatement {using transctionobject};
     
       如连接的数据库是sybase或者Sql,则selectblob和updateblob语句要求数据库的自动提交方式为true,所以在在每次调用selectblob和updateblob语句以前必须用命令 Sqlca.autocommit=true,把数据库的自动提交方式设置为true,在updateblob语句的结束后,再用命令Sqlca.autocommit = false,把自动提交方式设置为false。 索数据的参数(如flag),然后在可修改列的Protect后的框中输入(user_name是该DataWindow中的一列,代表输入者的名称):
     
      5、数据窗口的blob列
     
        5.1 数据窗口blob列的功能
     
      在PB 的datawindow画板中DBOLE控件允许用户利用这个控件浏览和操作数据库中的大二进制数据,即通过DBOLE控件可以作如下操作:
     
      往数据库中存储大二进制数据,如:excel工作表、word文档、视频文件、图片文件等各种格式的文件;
     
      ● 从数据库中检索数据到datawindow对象; 
     
      ● 使用OLE服务器程序察看修改数据; 
     
      ● 将修改后的数据保存回数据库;
     
      5.2 在数据窗口中添加blob列的的步骤
     
      1) 选择具有二进制字段的数据表作为数据源建立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列)
     
      2) 选择insert -control-OLE database blob 菜单,在数据窗口的detail节中要插入blob列的位置单击鼠标,这时将显示如图1所示的对话框
     
      下面解释这些属性的具体含义
     
      1) client class: 客户类名,默认为datawindow
     
      2) client name:客户名,默认为untitled
     
      3) table: 选择含有blob列的数据库表,所选表的字段将出现在右侧的large binary/text column列表框中。
     
      4) large binary/text column:选择一个blob类型的字段列
     
      5) key clause:检索和更新blob数据的关键字表达式其中使用带冒号前缀的变量指出是数据窗口对象的列,如 表达式 id=:id,id是数据库表中的列,变量指出数据窗口对象的列
     
      6) filetemplate :如果需要OLE应用服务器每次打开相同的文件,则在filetemplate框中输入文件名。
     
      7) OLE class :如果不需要OLE应用服务器每次打开相同的文件,则在OLE class框中选择一个OLE类,如Pbrush。
     
      8) Client name expression:显示在OLE服务器应用程序窗口标题的文字,可以输入为:"对应记录的id号是"+id
     
      单击ok按钮关闭对话框,将dbole列添加到适当的位置,保存数据窗口。 预览则可以对数据库中的blob数据进行存取,但是在新建的记录中只能存取OLE class框中选择的一种格式的blob数据,不能存储多种格式的数据;但如果数据库中存有多种格式的数据,可以预览各种格式的数据。
     
    6、源程序建立
     
      1) 首先在数据库中建立如下结构的表blobsave:
     
      字段名称数据类型备注
     
      idchar(4)primairy key index
     
      s_pathchar(50)
     
      pic binary (50)
     
      2) 在PB建立PBl库blobsave.PBl
     
      3) 在PBl库blobsave.PBl中建立应用blobsave
     
      在应用的open事件中设置数据库连接程序(本程序中采用的是odbc方式连接数据库,读者可根据自己所建立的数据库的不同选用不同的连接方式,以下连接数据库的代码也有所改动,至于连接不同的数据库的方法,请参考有关资料,本文不做详细介绍):
     
      SQLCA.DBMS = "ODBC"
     
      SQLCA.AutoCommit = False
     
      SQLCA.DBParm = "Connectstring='DSN=blob'"
     
      connect;
     
      open(w_main)
     
      其中命令按钮cb_path的clicked中的代码格式如下:open(w_path)
     
      其中命令按钮cb_dbblob的clicked中的代码格式如下:open(w_dbblob)
     
      其中命令按钮cb_OLEblob的clicked中的代码格式如下:open(w_OLEblob)
     
      4) 建立数据窗口dw_blobsave
     
      按照上文中建立数据窗口的blob列的方法建立数据窗口dw_blobsave如图所示:
     
      其中:add,del,save,cancel,,retrieve等分别为数据窗口dw_blobsave的append row,delete row,update,retrieve动作按钮。
     
      首先创建实例变量 OLEstorage stor1
     
      然后如图建立窗口w_path,其中数据窗口控件dw_1的rowfocuschanged中的代码如下:
     
      long row_num
     
      row_num=dw_1.getrow()
     
      if row_num >0 then
     
      ole_1.insertfile(dw_1.object.s_path[row_num])
     
      end if
     
      其中数据窗口dw_1的buttonclicked中的代码如下:
     
      if dwo.name="cbselect" then
     
      long row_num
     
      row_num=dw_1.getrow()
     
      string filepath,filename
     
      getfileopenname("请选择备注文件",filepath,filename)
     
      dw_1.object.s_path[row_num]=filepath
     
      ole_1.insertfile(filepath)
     
      end if
     
     
     
    PB API调用原型 [摘自Sybase中国]
      
     The tens of thousands of function calls in the Windows environment can be helpful to PowerBuilder users, but documenting them is nearly impossible. After hundreds of user inquiries, Powersoft Technical Support compiled these technical tips to enable PowerBuilder developers to translate standard Microsoft function calls into PowerBuilder syntax, and to empower developers to use any of the external API calls within their owerBuilder environments..
     
    The following information will help you translate and Windows SDK call to a PowerBuilder API function call. It doesn't matter whether you're using PowerBuilder 4.0, 5.0, 6.0, 7.0 or 8.0 but there are important differences between the 16- and 32-bit versions, as we'll discuss below.
     
    Step 1: Converting an SDK Call to a PowerBuilder API Call.
     
    First you need to get the syntax that wil be converted. This can be obtained from either a Windows API Bible or the MSDN (Microsoft Developers Network).
     
    Step 2: Determining Whether it is a Function or a Subroutine.
     
    Function calls return a value; subroutines do not.
     
    Here is an example of a Microsoft function:
    BOOL GetFileVersionInfo( LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData );
     
    Here is an example of a Microsoft subroutine:
    VOID GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);
     
    Step 3: Converting the datatypes from Microsoft to PowerBuilder. MICROSOFT PB(16Bit) PB(32Bit)
    Bool Boolean Boolean
    Char* Ref string Ref String
    Colorref Uint Ulong
    Dword Uint Ulong
    Handle Uint Ulong
    Hdc Uint Ulong
    Hfile Uint Ulong
    Hinstance Uint Ulong
    Hwnd Uint Ulong
    Int Int Int
    Lparam Uint Ulong
    Lpbyte Ref Int Ref Long
    Lpdword Ref Uint Ref Ulong
    Lpfiletime Ref Time Ref Time
    Lpint Ref Int Ref Long
    Lpstr,Lpststr Ref String Ref String
    Lpvoid Ref Structstruct_inst Ref Struct struct_inst
    Mcierror Long Long
    Lpstr,Lpststr Ref String Ref String
    Lpvoid Ref Structstruct_inst Ref Struct struct_inst
    Pbyte Ref Int[#] Ref Long[#]
    Short Int Int
    Structure Ref Struct struct_inst Ref Struct Struct_inst
    Uint Uint Uint
    Void** SUBROUTINE SUBROUTINE
    Word Int Ulong
    Wparam Uint Ulong
     
     
    Most of the datatypes are listed above, but some may be missing. When in doubt read the datatype description first. If still unsure, it is usually safe to assume a 16 bit datatype is a "uint" and a 32 bit datatype is a "ulong", since they are the most common.
     
    *If the word "Callback appears as a datatype, it cannot be performed by PowerBuilder. Callback routines are functions that are called from within functions.
     
    Step 4: Coding the Global/Local External Function:
     
    This is a Microsoft function:
    BOOL GetFileVersionInfo( LPTSTR lptstrFilename, DWORD dwHandle, DWORD dwLen, LPVOID lpData );
     
    The BOOL represents a boolean return code, which is translated to "Boolean" in PB for both 16 and 32 bit. A LPCTSTR means a pointer to a string (see step 3). In PowerBuilder, simply use the word "ref" before declaring the string in either 16- or 32-bit platofrms. DWORD is translated to "uint" for 16 bit and "ulong" for 32 bit. An LPVOID indicates that a structure is being used. In PowerBuilder, create a structure, assign it to an instance variable of that structure and pass it by reference. As a result, the following function declarations can be derived:
     
    PowerBuilder 16 bit:
    FUNCTION boolean GetFileVersionInfo(ref string filename, uint f_handle, uint f_length, ref lpdata lpdata2) LIBRARY "ver.dll"
     
    PowerBuilder 32 bit:
    FUNCTION boolean GetFileVersionInfoA(ref string filename, ulong f_handle, ulong f_length, ref lpdata lpdata2) LIBRARY "version.dll"
     
    Note: In the "gotchas" section listed below, you'll get a further explanation why an "A" is appended to the 32-bit function. You'll also find a handy technique to help you locate function calls within the DLLs.
     
    Step 5: Creating a Structure
     
    In this particular example a structure is needed so you'll need information on what elements are contained within this structure. The MSDN provides this information since the function being called is a Windows function.
     
    In the MSDN the structure appears like this:
    LPDATA = { DWORD dwSignature ; DWORD dwStrucVersion ; DWORD dwFileVersionMS ; DWORD dwFileVersionLS ; DWORD dwProductVersionMS ; DWORD dwProductVersionLS ; DWORD dwFileFlagsMask ; DWORD dwFileFlags ; DWORD dwFileOS ; DWORD dwFileType ; DWORD dwFileSubtype ; DWORD dwFileDateMS ; DWORD dwFileDateLS }
     
    In PB you would go into the structure painter and in this particular case all of these elements would be converted to ULONG. If one of the elements within the structure was a nested structure or callback routine you would not be able to use this function within PB. In that case the only option would be to create a C DLL that makes the function call and call it from PB.
     
    Step 6: Scripting the Function Call.
     
    Now that you have the function declaration you need to pass it the proper arguments. Taking the function " GetFileVersionInfoA" listed in Step 4 the following script would be needed:
     
    First you'll need to declare the datatypes. Keep in mind the variable names do not have to match the function declaration listed in step 4.
     
    boolean lb_rtn // Return code
    string ls_filename // 1st argument - filename
    ulong lu_hand // 2nd argument - f_handle
    ulong lu_len // 3rd argument - f_length
    lpdata lpdata2 // Last argument - assigning an instance of a structure.
     
    Next is the hardest part and that is assigning values to the arguments. This part may require use of the MSDN, API Bible or whatever reference is available that covers the function you are calling. In this particular case the information is contained within the MSDN.
     
    The first argument " ls_filename ", should be set to the path and filename of the target file.
     
    ls_filename = "c:/windows/calc.exe" // The calculator would be a good file to test against.
     
    The second argument "lu_hand" according to the MSDN is ignored. This is probably reserved for a future version of Windows to use. To be safe the argument should be set to null.
     
    setnull(lu_hand)
     
    The third argument "lu_len" contains the size of the buffer that the information will be returned into. It is critical that the buffer size not be too small or the information may overflow into another part of memory causing a GPF or Dr. Watson error. In this particular case since the structure contains 13 elements that are all ulong, the number 256 should be sufficient to contain the information.
     
    lu_len = 256
     
     
     
    The last argument "lpdata2" is an instance of the structure "lpdata" and it will be populated by the function call.
     
    The final script will appear as follows:
     
    boolean lb_rtn
    string ls_filename
    ulong lu_hand, lu_len
    lpdata lpdata2
    ls_filename = "c:/windows/calc.exe" // The calculator would be a good file to test against.
    setnull(lu_hand)
    lu_len = 256
    lb_rtn = GetFileVersionInfoA(ls_filename, lu_hand, lu_len, lpdata2)
     
    // Viewing the output -------------------------------------------------------------
    sle_1.text = string(lpdata2.dwSignature)
    sle_2.text = string(lpdata2.dwStrucVersion)
    sle_3.text = string(lpdata2.dwFileVersionMS)
    sle_4.text = string(lpdata2.dwFileVersionLS)
    sle_5.text = string(lpdata2.dwProductVersionMS)
    sle_6.text = string(lpdata2.dwProductVersionLS)
    sle_7.text = string(lpdata2.dwFileFlagsMask)
    sle_8.text = string(lpdata2.dwFileFlags)
    sle_9.text = string(lpdata2.dwFileOS)
    sle_10.text = string(lpdata2.dwFileType)
    sle_11.text = string(lpdata2.dwFileSubtype)
    sle_12.text = string(lpdata2.dwFileDateMS)
    sle_13.text = string(lpdata2.dwFileDateLS)
    Messagebox("Return Code", string(lb_rtn))
    // -----------------------------------------------------------------------------------------
     
    Gotcha's to look out for:
    1. Make sure the DLL you are referencing is the right bit level. This can sometimes be done by looking at the DLL's properties but most likely you'll need a third party product to determine this. Remember, a 16 bit application cannot make a 32 bit API call and visaversa.
    2. Some functions are cap sensitive. "Findwindowa" might fail whereas "FindWindowA" works.
    3. All handles in PowerBuilder 16 bit are UINT and 32 bit are ULONG. Using the datatypes INT or LONG may work but if the handle points to an area in high memory the latter two datatypes may not be able to support such a large number.
    4. Make sure you have the correct function name. Under 32 bit many of the functions had an "A" (Whcih stands for Ascii) appended to the function name to make it unique from it's 16 bit counterpart. This allows developers to place both 16 bit and 32 bit function calls in the same application and then making the correct function call based on what bit platform the program is being run from. The real reason why Microsoft named the functions this way was to differentiate between (A)-Ascii and (W)-Unicode format. The MSDN does not always list the proper names for the functions. For example: GetFileVersionInfo is listed as a 32 bit function but it is in fact GetFileVersionInfoA.
    5. Global versus Local External Function declaration. If the function is declared globally it can be called from anywhere in your application. If you declare the function as a Local External Function it can only be called from that window where it's declared. Local Function use less resources then globals but the difference is very minimal.
     
    Error Messages and what they mean:
    1. Error: Error opening DLL library <filename> for external function at line <line_number> in the <event name> event of object <object_name> of <window_name>.
     
    Possible causes:
    > DLL is 16 bit and thus incompatible.
    > DLL is not in a searchable directory.
    > DLL connects to another DLL that cannot be found.
    > DLL has the same name as another already loaded into memory.
    > DLL is corrupted or in an incompatible format.
     
    2. Error: Error calling external function <function_name> at line <line_number> in the <event name> event of object <object_name> of <window_name>.
     
    This is probably the result of an incorrectly spelt function name. Be sure to verify that the function name matches what is in the DLL exactly, including the case of the letters.
     
    3. Error: Specified argument type differs from required argument type at runtime in DLL function <function_name>. (Invalid stack pointer on return from function call) at line <line_number> in <event_name> event of object <object_name> of <window_name>.
     
    This error usually indicates the datatypes do not match what the DLL function is expecting.
     
    4. PB050: Caused an Invalid Page Fault in module PBSHR050.DLL @ 0137:1111163e
     
    This error can occur either immediately upon calling the function or when the application closes. The module and memory address may vary but the reason for this is usually the same. If PB is receiving a string and memory isn't allocated in advance using the SPACE( ) that string will overflow into another memory area. To allocate 12 characters to the string "ls_filename" the following code would be used.
     
    ls_filename = space(13) // You may want to give it an extra space just to be safe.
     
    5. Receiving garbage from the DLL. i.e. Last name populated as: "*#^&Ryan"
     
    This problem is most likely the result of the byte alignment being set incorrectly. PowerBuilder expects the byte alignment to be set to one and if you are using MSVC++ compiler the default setting is four. To set the byte alignment to one you would need to do the following prior to compiling to a dll.
     
    - Select the desired target
    - Right mouse click and select Settings
    - Select the C/C++ tabpage
    - Select Code Generation from the Category dropdown list
    - Select desired byte alignment from the Struct Member Alignment dropdown list.
     
    The DOS switch to set the byte alignment to one is: /zp1
     
    A handy trick to find functions quickly:
     
    1. On Win95,Win98 or NT 4.0 click on the START button and select "Find", then "Files or Folders".
    2. In the SLE entitled "Named" enter "c:/*.dll". If this is a Windows DLL that you'll be calling enter "c:/windows/*.dll".
    3. Click on the "Advanced" tab and in the "Containing Text" SLE enter the exact function name you are looking for. For example: FindWindowA
    4. There will usually be a lot of DLL's that contain the function you are looking for but try to use the main Windows DLL's whenever possible since they are already loaded into memory.
     
    Related Faxlines:
    47626 - External Functions Calls to the DLLs created using Visual C++
    44596 - 16 Bit - Windows API Calls for PowerBuilder 4.0, 5.0 & 6.0
    44545 - 32 Bit - Windows API Calls for PowerBuilder 5.0
    44648 - Prototyping API Calls for PowerBuilder 4.0, 5.0 and 6.0
    44588 - Dynamically Closing a Non-PowerBuilder Application
    47703 - GPF's and The PowerBuilder Memory Defragger
    47704 - Windows 3.10 and 3.11 Functions - Krnl386.exe, User.exe, Gdi.exe
    47707 - 16 Bit - Win95 and NT Functions - Krnl386.exe, User.exe, Gdi.exe
    47705 - 32 Bit - Win95 and NT Functions - Kernel32.dll, User32.dll, Gdi32.dll
    44474 - External Function Calls
    44538 - Passing a 32-bit PowerBuilder structure to a 32-bit C DLL Created in Power++
     
     
     
    基于PB的Client/Server两层结构向基于Web分布式应用的平滑过度学历:硕士
    一、企业应用系统现状及发展趋势
    1、应用现状
    目前大多数应用软件系统都是Client/Server形式的两层结构,应用安装并运行在客户端的计算机中,通过局域网或广域网连接与后台数据库服务器连接并共享数据,并把原始数据或处理后的数据存储在后台数据库中。
    2、发展趋势
    现在的软件应用系统正在向分布式的Web应用发展;内部的和外部的用户都可以访问新的和现有的应用系统,Web和Client/Server 应用都可以进行同样的业务处理;不同的应用模块共享逻辑组件;通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。
    (1) Web 应用的优势
    对传统Client/Server应用系统和Web应用的构造应用系统的基本要素进行比较,就会发现与传统客户/服务器应用相比(表1), Web 应用有很多优点。
    表1 客户/服务器应用和Web应用对比
    比较内容
     客户/ 服务器应用
     Web 应用
    网络协议
     IPX/SPX
    TCP/ IP
    NetBEUI
     TCP/IP
     运行环境
     Windows'95
    NT、Mac
    UNIX
     Browser
     客户端配置
     Database driver
    Run-rime Application
    (胖客户端)
     Zero
    (瘦客户端)
      因此,基于Web 技术构造应用系统,可以显著降低系统维护和提交费用,用户还可从统一界面和简化操作中受益。
    (2)Web 应用发展方向
    由于传统的Web应用中使用的HTTP协议是一种无常连接的协议,所以无法在浏览器上获得实时的数据,也就无法实时处理数据和精确地控制事务,并且无法构造Web上的OLTP(在线事物处理)应用。因此,必须在浏览器到应用服务器之间提供新的通讯协议。
    针对这种市场需求,各大主流数据库厂商,如Sybase、Oracle,以及浏览器和Web 服务器提供商,如Microsoft、Netscape 等都纷纷推出以Web 服务器和浏览器的扩展技术为基础,数据库厂商提供实现数据库访问的应用服务器。这样,Web 应用就从传统客户机/服务器两层体系结构,扩展为浏览器/Web 服务器+应用服务器/数据库服务器的三层或多层体系结构。
    Web 平台的扩展可以分为Web 服务器端扩展和浏览器端扩展两类。目前主要的Web服务器扩展技术一般都是通过提供一个支持CGI、ISAPI或NSAPI 扩展标准的应用服务器来实现。其中,CGI(Common Gateway Interface) 是通用的Web 服务器扩展标准,而ISAPI 和NSAPI 则属于厂商单独定义的扩展规范,只为各自特定的Web 服务器提供功能扩展。数据库厂商提供的应用服务器一般都支持这些扩展标准,以保证开放性。在这一点上,Sybase的产品尤为突出(后面会对其进行详细介绍)。
    基于应用服务器的扩展技术的基本原理如下:应用服务器通过对Web 服务器的扩展,使浏览器可以通过HTML或其它类似的脚本语言,调用应用服务器提供的功能,从而扩展浏览器和Web 服务的应用领域。当浏览器引入一个带有应用服务器功能调用的URL 时,Web 服务器就通过标准的扩展技术,调用应用服务器提供的功能,完成解释脚本、传递参数和结果形成等工作,最后应用服务器的执行结果以HTML的格式传递到浏览器。
    使用位于应用服务器或Web 服务器上的对象,通过这些对象实现对后台数据库联机访问,从而可以更好地控制每个事务,得到更快的访问速度,并且可以实现将OLTP应用放在Web 上。
    二、Sybase的Web解决方案
    随着Web 技术的飞速发展,用户构造基于Web 应用的需求也在迅速增长。Sybase作
    为业界领先的数据库产品提供商,紧跟Internet技术的发展潮流,不断推出新的应用产品。 Sybase公司提出的e-Map策略,即“Sybase e-Mapto e-Business”,就是一套完整的Web解决方案。它描绘出如何使用最简便的方式建立电子商务(Web应用)的过程,可以引导你快速、高效并且非常容易地将现有业务转换成电子商务模式,而并不需要对现有业务运行方式做太大改变。
    Sybase e-Map for PowerBuilder是Sybase e-Map策略的一个组成部分,是开发人员把现 有的PowerBuilder应用快速移植到Web上的捷径,其中包含的技术不但可以支持目前的业务需要,而且能够适应新的电子商务应用。
    Sybase可以满足重要的应用服务器的安全性、可伸缩性和可靠性。很多公司都采用了Sybase 的应用服务器Enterprise Application Server, 简 称EAServer。它在同类产品中处于领先的地位。
    1、EAServer 支持所有的主要组件类型
    EAServer 具有集成化的业务逻辑提交能力, 这个功能是将Client/Server应用扩展到Web 上的关键因素。它能够处理所有主要的组建类型, 包括PowerBuilder、Java、COM、CORBA 和C++。 因此只有 EAServer 能够允许你同时使用Visual Basic 应用中的COM 组件和 PowerBuilder 应用中的NVO组件,也只有EAServer可以支持现有的组件和其他如C++、CORBA 和Java组件之间的交互。
    2、EAServer可以连接所有主要的客户类型
    Sybase EAServer 管理的逻辑组件可以被很多类型的客户端调用,包括PowerBuilder、Java、COM、CORBA和C++,甚至还包括HTML。
    3、延续PowerBuilder的投资
    如果你使用PowerBuilder 开发了现在的系统,那么Sybase 的e-Map for PowerBuilder 就具有非常重要的意义。
    第一,所掌握的使用PowerBuilder的技术仍然可以用于开发电子商务应用。
    第二,e-Map可以保持企业中 PowerBuilder 开发人员的价值。
    总之,Sybase e-Mapfor PowerBuilder 指出了一条切实可行的通向电子商务的道路,但是要真正地实现电子商务仍然有很多路要走,这也是e-Map策略中包含了培训、 顾问服务和技术支持的原因。下面将具体就PB程序员的Web应用作一详细介绍。
    三、传统PB两层结构的Web之路
    这里主要介绍传统的PowerBuilder程序员如何平稳过度到基于Web的三层体系结构,也就是利用EAServer以及其他相关的Sybase工具建立企业解决方案。可以利用PowerJ来建立分布式应用,但本文将着重讨论如何利用PowerBuilder7.0来建立分布式应用。随着PowerBuilder 7.0 的推出,这一工作变的非常简单,Sybase在PowerBuilder和EAServer的集成问题方面相当成功。将PowerBuilder 组件和基于Powerbuilder所积累的技巧转移到Web或其他分布式环境,是一件非常轻松的事情。下面将着重讨论这方面的问题。
    在讨论之前,首先谈一下EAServer和Jaguar CTS之间的区别。EAServer(Enterprise Application Server ——企业应用服务器)是Jaguar CTS和PowerDynamo整合后的新名称。这两个产品相互补充,Jaguar CTS提供组件事务支持,PowerDynamo则利用其对市场上各种主要Web服务器的扩展能力提供可缩放的动态HTML支持。在本文中,EAServer是指Jaguar CTS和PowerDynamo集成后的产品,但这里将着重讨论Jaguar CTS,即组件事物服务器。
           下面将以一个实际例子来详细讨论如何通过使用Jaguar CTS的JDBC/ODBC Bridge访问第三方数据库中的数据(在本文中为Oracle 8)而建立EAServer的PB NVO组件的全过程,并且讨论组件完成后建立Java应用的几个主要环节,包括与服务器EAServer连接,Java组件的实例化,方法调用等等。
    首先配置EAServer,这是非常重要的,只有EAServer 的正确配置,才能为应用提供组件服务,否则即使开发出成功的PB组件也无法在Web端调用。
    1、环境变量的设置
    对于环境变量CLASSPATH,增加以下两个CLASSPATH(身份为SYSTEM):
    %JAGUAR%/html/classes; % JAGUAR%/java/classes
    环境变量PATH:增加以下目录:C:/ program files/sybase/shared/sun/jdk118/bin。假设sybase安装在c:/program files/sybase目录下。
    2、配置监听器(listener)
    配置监听器的目的是使除本机外的其他机器可以访问EAServer,这对于小组开发非常重要,当然如果你不想其他机器访问EAServer,则可以跨过这一步。监听器的缺省设置为“localhost”。要想改变这一缺省设置,应从Jaguar CTS出发,启用Jaguar Manager,即从菜单中作选择“Tools │Connect │Jaguar Manager”。在Jaguar Manager启动之后,采用默认用户进行登录,即User Name为jagadmin,Password为空,Host Name就是localhost。登录成功后,按以下路径找到监听地址 “Sybase Central / Jaguar Manager / Servers / Jaguar / listeners”。这时,在屏幕的右面可看到一个监听地址表。尽管我们实际上只用两个地址,但还是对所有的地址作相应的改变:右击每个监听地址并选择“listener Properties”,然后在”Host”域中送入你所在机器的IP地址或TCP/IP名;如果你使用的是WinNT,Win98或 Win95,则应在该域中填入你在网络设置中所使用的计算机名。然后,Jaguar CTS将在服务器启动时查找相应的IP地址。完成所有这些工作之后,应关闭Jaguar Manager,然后再重新启动Jaguar CTS服务器。
    至此,EAServer服务器已配备就绪,可以接受客户请求了。下一步的任务是作一些检查,看看是否正确地配置了安装的连接缓冲区。
    3、验证/创建连接缓冲区
    连接缓冲区是EAServer与数据库之间的网关(gateway)。这是一些预先配置的数据库连接,通过访问这些连接,使组件能够快速而有效地得到它们所需要的数据。这些高速缓冲区,是EAServer借以对数据库连接和对各个组件的数据库事务作集中控制的重要手段。
    本文以Oracle 8数据库的连接为例,进行配置连接缓冲区。首先登录到Jaguar Manager,鼠标选中Connection Caches,选择菜单File/New Connection Cache,出现一个对话框,要求输入新的连接缓冲池的名字,这里输入Cache_test,点击Create New Connection Cache按纽,出现该缓冲池的配置信息。在标签为General 的页面中,填入Description(描述信息),以及Server Name,user name和password。其中Server Name为在该机器上配置的Oracle数据库的TNS名字,User name为数据库的用户名,password为相应的口令。Driver标签为相应的数据库驱动程序,由于我们在此配置的是Oracle 8数据库,所以选择OCI 8.x,该数据库的驱动程序为oci.dll。最后在Cache标签页中将两个选择都选中,这是与数据库的连接方式选择。至此数据库
     
    四、建立服务器组件
    随着EAServer的配置就绪以及连接缓冲区的正确设置,下面的工作就是建立服务器组件。服务器组件的建立有许多的方法,这里我们主要讨论,对于PowerBuilder程序员的最方便和最简单的服务器组件建立方法。这里从零开始建立一个能访问Oracle 8数据库并将数据送达给客户的Jaguar组件。在PowerBuilder 7中,专门针对组件服务,新增加了Jaguar 组件开发方法。下面将一一介绍PowerBuilder NVO开发Jaguar组件。
           首先,打开PowerBuilder 7并选择 “File │New | Start Wizard”,在此向导面版中选择Jaguar Component。然后在向导提示下,依次要求输入Application name(应用名),这里输入test;Component name(组件名),默认为n_test;Jaguar Server的一些信息,设置这些信息的目的主要是为了组件的提交,Server name 填入前面在监听器配置中配置的机器名,Port默认为9000,登陆ID默认为jagadmin,password为空(这些默认设置可以在Jaguar manager中改变);然后提示输入Package name(包名),后面均取默认设置,在Specify the debugging and live editing option选项中,选中Supports Remote Debugging 和Supports live editing,目的是为了支持远程和现场调试;在Specify Dynamic Library Options中,选中including unreferenced objects in consolidated PBD,只有选中此项,才支持SQLCA对象,否则不支持此对象。最后,单击Finish按纽,即可创建所需要的Jaguar组件了。
           下面创建一个非常简单的Jaguar组件例子,这个小例子完成的功能就是从Oracle数据库中取出一个库表的记录集。首先定义事件,一般在NVO的Activate事件中编写连接数据库的代码,在Deactivate中编写撤消连接的代码。与Oracle 数据库的连接是通过前面配置的连接缓冲进行的。
           首先声明变量
    protected DataStore ids_ResultSet
       事件Activate代码如下:
    SQLCA.DBMS = "O84 ORACLE 8.0.4"
    SQLCA.AutoCommit = False
    SQLCA.DBParm = "PBCatalogOwner='test',CacheName='Cache_test'"
    CONNECT USING SQLCA;
    IF SQLCA.SQLCode < 0 THEN
           messagebox("NbjcError","Error in Connect using SQLCA")
    END IF
        这里,数据库的用户名为test,前面配置的连接缓冲名为Cache_test。
       事件Deactivate代码如下:
    destroy ids_resultset
    disconnect using sqlca;
           编写一个函数getRecord(),在组件中称为方法,用来取出数据表Student的所有记录集,数据表Student为一个普通的Oracle库表。
    resultset lrs_res     //返回的结果集
    ids_ResultSet = CREATE datastore
    ids_ResultSet.dataobject="Student"     
    ds_ResultSet.settransobject(SQLCA)
    ids_ResultSet.retrieve( )
    ids_ResultSet.GenerateResultSet(lrs_res)
    return lrs_res
           在此应用中定义一个Grid 类型的数据窗口对象,数据源即为前面反复提到的库表Student。
           在完成了对该函数的定义之后,在pbl中选择刚刚创建的package(包) p_test,然后在菜单中选择“Run │Build ” 而实施对类的编译。如果编译中没有出现错误,则该服务器组件即告完成,同时自动提交到在向导处定义的Jaguar服务器组件中。
           如果我们选择用Java方法来调用该组件,还需要生成和编译该组件的存根类和帮助(helper)类。具体地说,应当依此进行以下的操作才能完成组件的安装,才能在Power Dynamo中正确调用。将组件登记到EAServer服务器中的工作是由PowerBuilder自动完成的。然后再生成和编译该组件的存根类。在这些工作完成后,你的组件就可供使用了。
           生成和编译组件的存根类和框架类的方法是:首先打开Jaguar CTS manager,然后登陆到Jaguar manager,默认用户名和口令分别为Jagadmin和空。然后选择Install package,在已安装的包中,找到我们在PB7中新建的包名p_test。右键单击,选择“Generate Stub/Skeleton”,选择Generate Stubs,Geneerate Java Stubs,单击Generate,系统提示成功后单击OK。至此,Java的存根和帮助文件都已生成,默认目录在EAServer服务器的类路径上,如果需要单独指定,必须在CLASSPATH中指定新的类路径。最后一步是编译这些文件,这个过程不能在图形界面中完成,要求开发者选择自己的方法来编译这些文件。其中最简单的方法就是采用命令行编译器来进行编译。具体的编译和安装过程如下:
    从命令行提示出发找到%JAGUAR%/html/classes/p_test目录,然后执行命令
    javac*.java
    至此,已完成对新建组件的安装过程,该组件随时可以被使用了。说明一点,只有当初始安装该组件以及当该组件的签名(signature)改变时才需要执行这一过程。组件的签名构成定义组件界面(包括方法名和变量)的所有要素。如果改变的只是组件的内部逻辑,就不必重新生成存根类,因为这些类只是指向实现类功能的指针,而并非包含这些逻辑本身。
    在所需的组件完成后,下一步的任务是建立一个简单的Web应用,实现与EAServer服务器的连接,并利用组件n_test中的逻辑从数据库Oracle中检索数据。这也就是一个典型的Browser/Application Server/Database的三层应用了。关于如何在PowerDynamo的页面文件中调用组件的方法,这里就不详细谈,总之是比较简单的,只要创建这个组件的实例,然后就可以访问这个组件的方法,完成逻辑功能的调用。
    如果你的Web应用没有显示正确的数据,可以查看EAServer服务器日志中的出错信息来判断错误发生在什么地方。查看EAServer服务器日志有两种办法:或者直接从%JAGUAR%/bin/srv.log查看,或者通过Jaguar Manager在”Sybase Central / Jaguar Manager / Servers / Jaguar / File Viewer” 查看。在后一种查看方式下,先打开File Viewer,再从列表中选择名为”srvlog”的文件。如果没有得到所需要的正确数据,这个文件应当提示相应的错误是什么,根据该文件提示的内容或者修改组件或者修改配置。
    结论
    本文讨论了一个完整的过程来说明如何利用PowerBuilder7和EAServer成功建立一个简单Web应用的例子。从这个例子也可以看出,对于传统的PowerBuilder程序员,只要理解分布式应用的一些概念和Web开发的方案,就可以非常平滑的由传统的Client/Server开发过度到基于Web的三层或多层应用。
     
     
     
    在PB应用中收发电子邮件
    卞国斌
    ---- 随 着Internet 进 入 千 家 万 户, 通 过Internet 收 发 电 子 邮 件 将 成 为 人 们 最 受 欢 迎 的 通 讯 手 段 之 一。 如 果 我 们 的 应 用 程 序 也 能 够 提 供 收 发 电 子 邮 件 的 功 能, 就 可 以 使 我 们 方 便 快 捷 地 与 他 人 交 换 和 共 享 应 用 的 数 据 和 信 息, 使 其 应 用 真 正 地 溶 合 于Internet 这 个 大 环 境。 下 面 我 介 绍 一 下 在PowerBuild 应 用 中 实 现 收 发 电 子 邮 件 的 方 法。
    ---- 在PowerBuild 应 用 中 实 现 收 发 电 子 邮 件, 主 要 是 通 过PowerBuild 系 统 提 供 的 一 套 用 于 邮 件 操 作 的 内 嵌 函 数。 这 些 函 数 实 现 其 应 用 到 微 软 公 司 的MAPI(Message Application Program Interface) 标 准 之 间 的 接 口。
    ---- 一、 作 为 举 例, 创 建 一 个MDI 风 格 的 窗 口w_mail。 在 这 个 窗 口 上, 放 置 一 个 含 接 收 邮 件、 发 送 邮 件 和 地 址 薄 三 个 带 图 标 的 菜 单 项 的 菜 单m_mail, 一 个 多 行 编 辑 器mle_1。 整 个 窗 口 的 外 观 如 下:
    ---- [ 图 略]
    ---- 二、 为 各 菜 单 项 编 制 事 件(Event) 处 理 程 序(Script)。 程 序 行 中// 后 的 为 说 明 文 字。
    ---- 1. 在 菜 单 项“ 接 收 邮 件” 的 单 击(Clicked) 事 件 下 输 入 下 面 程 序:
    mailsession mses
     //定义对象mses,以供在程序中引用
    mailmessage mmsg      
    //定义结构mmsg,此结构用于描述邮件的内容
    mailrecipient mrec
    //定义结构mrec,它标识邮件的接收者和发送者
    mailreturncode mreturn
    //定义返回码,用于存放函数的返回值
    int mnbr
    //定义临时变量
    //产生邮件会话对象mses
    mses = create mailsession
    //邮件登录。此处用户名,口令缺省
    mreturn = mses.maillogon(mailnewsession!)
    if mreturn <> mailreturnsuccess! Then
     messagebox("邮件登录","邮件登录失败!")
     return
    end if
    //获得接收到尚未读过的邮件ID号。
    它是放在mses中的一个字符串数组
    mreturn = mses.mailgetmessages(true)
    if mreturn <> mailreturnsuccess! then
     messagebox("邮件获取","邮件获取失败或无新邮件!")
     return
    end if
    //获得接收到尚未读过的邮件数目
    mnbr = upperbound(mses.messageid[])
         //读取最后接收到的邮件内容。
        它被放在mmsg的notetext的字符串字段中
    mses.mailreadmessage(mses.messageid[mnbr],
    mmsg,mailentiremessage!,true)
    //把获得的邮件内容放到窗口w_mai1上的多行编辑器mle_1中
    w_mai1.mle_1.text=mmsg.notetext
    //退出登录
    mses.maillogoff()
    //取消邮件会话
    destroy mses
    ---- 2. 在 菜 单 项“ 发 送 邮 件” 的 单 击(Clicked) 事 件 下 输 入 下 面 程 序:
    mailsession mses
    mailmessage mmsg
    mailreturncode mreturn
    //产生邮件会话对象mses
    mses = create mailsession
    //邮件登录
    mreturn = mses.maillogon(mailnewsession!)
    if mreturn <> mailreturnsuccess! then
     messagebox("邮件登录","邮件登录失败!")
     return
    end if
    //弹出邮件地址窗口,获取邮件接收者的地址。
    地址及名字是放在mmsg中的一 个结构数组
    mreturn = mses.mailaddress(mmsg)
    if mreturn <> mailreturnsuccess! then
     messagebox("邮件地址","邮件地址出错!")
     return
    end if
    //把窗口w_mai1上的多行编辑器mle_1
    中的内容放到mmsg的notetext字段中
    mmsg.notetext = w_mai1.mle_1.text
    //发送邮件
    mreturn = mses.mailsend(mmsg)
    if mreturn <> mailreturnsuccess! then
     messagebox("邮件发送","邮件发送失败!")
     return
    else
     messagebox("邮件发送","邮件发送成功!")
    end if
    //退出登录
    mses.maillogoff()
    //取消邮件会话
    destroy mses
    ---- 3.在菜单项“地址簿”的单击(Clicked)事件下输入程序:
    mailsession mses
    mailmessage mmsg
    mailreturncode mreturn
    //产生邮件会话对象mses
    mses = create mailsession
    //邮件登录
    mreturn = mses.maillogon(mailnewsession!)
    if mreturn <> mailreturnsuccess! then
     messagebox("邮件登录","邮件登录失败!")
     return
    end if
    //弹出邮件地址窗口,获取邮件接收者的地址
    mreturn = mses.mailaddress(mmsg)
    if mreturn <> mailreturnsuccess! then
     messagebox("邮件地址","邮件地址出错!")
     return
    end if
    //退出登录
    mses.maillogoff()
    //取消邮件会话
    destroy mses
    ---- 三、 执 行 程 序。 正 常 执 行 程 序 的 前 提 是, 在Powerbuild 应 用 所 在 的 机 器 上 已 装 有Microsoft Mail 客 户 软 件。
    ---- 1. 单 击“ 接 收 邮 件” 菜 单 项 或 工 具 图 标, 执 行 接 收 邮 件 处 理 程 序。 该 程 序 将 最 后 接 收 到 尚 未 读 过 的 邮 件 内 容 显 示 到 窗 口 的 多 行 编 辑 器 中。
     如 果 把mreturn = mses.mailgetmessages(true) 改 为:
    mreturn = mses.mailgetmessages()
     便 可 获 得 全 部 邮 件( 包 含 已 读 过 的 邮 件)。
    ---- 2. 单 击“ 发 送 邮 件” 菜 单 项 或 工 具 图 标, 执 行 发 送 邮 件 处 理 程 序。 该 程 序 执 行 过 程 中, 弹 出 地 址 簿 窗 口, 在 你 选 择 好 接 收 者 后, 则 将 窗 口 的 多 行 编 辑 器 中 的 内 容 发 送 出 去。
    ---- 3. 单 击“ 地 址 簿” 菜 单 项 或 工 具 图 标, 执 行 地 址 簿 处 理 程 序。 该 程 序 弹 出 通 讯 簿 窗 口, 供 你 增 加、 编 辑 或 删 除 邮 件 地 址 属 性。
     
     
     
     
    如 何 实 现PB 应 用 程 序 的 屏 幕 保 护 功 能
    太 原 重 型 机 械 学 院 软 件 工 程 教 研 室    李 邦 庆 王 二 才
     
    ---- 说 到 屏 幕 保 护, 一 般 人 会 认 为 那 是 操 作系 统 的 事, 其 实 在 自 己 开 发 的 应 用 程 序 中 也可 实 现 屏 幕 保 护 功 能, 而 且 这 一 功 能 除 了 确实 能 保 护 显 示 器 屏 幕 外, 还 能 增 加 意 想 不 到的 效 果, 比 如 能 将 软 件 版 本、 程 序 图 标、 开 发人 员 介 绍 等 相 关 信 息 以 动 态 文 字 和 动 画 反 复播 放。 在PowerBuiler 中 使 用idle() 函 数 和idle 事 件可 实 现 这 一 功 能。
    ---- 一 . idle() 函 数 和idle 事 件
    ---- idle() 函 数 叫 空 闲 函 数, 与 timer() 函 数 有点 类 似, 功 能 是 为 系 统 设 置 一 个 定 时 器, 时间 一 到 就 触 发idle 事 件, 函 数 的 参 数 为 以 秒 为单 位 的 时 间,idle 事 件 叫 做 空 闲 事 件, 当 系 统接 到 鼠 标 或 键 盘 激 活 的 消 息 时 中 止idle 事 件;
    ---- 二 . 制 作 屏 幕 保 护 窗 口
    ---- 1 . 新 建 一 窗 口w_save_screen 作 为 屏 幕 保 护窗 口, 因 为 屏 幕 保 护 界 面 一 般 是 对 整 个 屏 幕的, 窗 口 不 含 标 题 条 和 菜 单 条, 这 要 求 窗 口的 类 型 最 好 为response( 响 应 窗 口)。 至 于 窗 口 显示 什 么 样 的 文 本、 图 片 或 动 画, 以 何 种 方 式显 示, 依 开 发 者 的 爱 好 和 用 户 的 需 求 而 定,本 文 的 屏 幕 保 护 是 动 态 显 示 一 幅 介 绍 软 件 的图 片。
    ---- 2. 在 屏 幕 保 护 窗 口 里 加 入 一 图 形 控 件p_1,在 窗 口 的open 事 件 写 以 下 代 码:
    //图形控件p_1装入当前路径下的一幅图,文件名:scgl6.bmp
    p_1.picturename= "scgl6.bmp"
    //每隔0.1秒触发一次timer事件,形成动画效果
    timer(.1)
     
    ---- 3. 声 明 窗 口 的 实 例 变 量:
     
    integer ii_i = 1 //用于动画可反复播放的循环数
     
    ---- 4 . 在 本 例 中, 限 于 篇 幅, 为 减 少 相 似 程 序 代 码 量, 图 形 只 可 向 下 平 移、 向 右 下 角 斜 移, 读 者 可 稍 作 改 动 就 可 写 出 向 上、 向 左、 向 右 平 移, 向 四 个 角 斜 移 斜 的 代 码。 在 窗 口 的 timer 事 件 下 写 以 下 代 码
     
    integer li_num //图片位置变量
    if ii_i =1 then
    for li_num=1 to 1540 step 1
    //Y坐标递增,图形向下移
    p_1.Move(1,li_num) next
    ii_i ++
    p_1.Move(1,1)
    p_1.SetRedraw(true)
    return
    end if
    if ii_i=2 then
    for li_num=1 to 1540 step 1
    //X、Y坐标同时递增,向右下角移动
    p_1.Move(li_num, li_num)
    next
    ii_i = 1 //循环复位,重新开始下一轮
    p_1.Move(1,1)
    p_1.SetRedraw(true)
    return
    end if
     
    ---- 三 . 应 用 程 序 代 码 的 编 写
     
    ---- 打 开 应 用 程 序 的 的script 画 板 中, 在open 事 件 中 增 加 下 面 一 行 代 码:
     
    idle(120) //2分种没有鼠标或键盘消息触发idle事件
    在idle事件中写下面的代码用于打开屏幕保护窗口
    open(w_save_screen)
    至此一个完整的屏幕保护功能就实现了。
     
    ---- 四 . 更 进 上 步 的 说 明
     
    ---- 本 例 子 较 为 简 单, 如 启 动 屏 幕 保 护 的 时 间 只 能 限 制 在2 分 钟, 不 够 灵 活, 其 实 这 一 缺 点 也 容 易 克 服, 方 法 是: 把 启 动 时 间 定 义 为 一 个 全 局 变 量, 将 其 保 存 在 一 配 置 文 件 中, 由 用 户 自 己 设 置 启 动 时 间, 甚 至 可 以 关 闭 屏 幕 保 护 功 能, 每 次 应 用 程 序 启 动 时 从 配 置 文 件 中 读 取 这 一 参 数, 然 后 传 给idle() 函 数。
     
     
     
     
    在PB帮助中,send函数说明
    message#An UnsignedInteger whose value is the system message number of the message you want to send
    这其中的message#就是楼上说的WM_COMMAND,其定义可以从微软的SDK中的WINDOWS.H中找到。
    WM_NULL            = $0000;
     WM_CREATE          = $0001;
    应用程序创建一个窗口
     WM_DESTROY          = $0002;
    一个窗口被销毁
     WM_MOVE            = $0003;
    移动一个窗口
     WM_SIZE            = $0005;
    改变一个窗口的大小
     WM_ACTIVATE        = $0006;
    一个窗口被激活或失去激活状态;
     WM_SETFOCUS        = $0007;
    获得焦点后
     WM_KILLFOCUS        = $0008;
    失去焦点
     WM_ENABLE          = $000A;
    改变enable状态
     WM_SETREDRAW        = $000B;
    设置窗口是否能重画 
     WM_SETTEXT          = $000C;
    应用程序发送此消息来设置一个窗口的文本
     WM_GETTEXT          = $000D;
    应用程序发送此消息来复制对应窗口的文本到缓冲区
     WM_GETTEXTLENGTH    = $000E;
    得到与一个窗口有关的文本的长度(不包含空字符)
     WM_PAINT            = $000F;
    要求一个窗口重画自己
     WM_CLOSE            = $0010;
    当一个窗口或应用程序要关闭时发送一个信号
     WM_QUERYENDSESSION = $0011;
    当用户选择结束对话框或程序自己调用ExitWindows函数
     WM_QUIT            = $0012;
    用来结束程序运行或当程序调用postquitmessage函数
     WM_QUERYOPEN        = $0013;
    当用户窗口恢复以前的大小位置时,把此消息发送给某个图标
     WM_ERASEBKGND      = $0014;
    当窗口背景必须被擦除时(例在窗口改变大小时)
     WM_SYSCOLORCHANGE = $0015;
    当系统颜色改变时,发送此消息给所有顶级窗口
     WM_ENDSESSION      = $0016;
    当系统进程发出WM_QUERYENDSESSION消息后,此消息发送给应用程序,
    通知它对话是否结束
     WM_SYSTEMERROR      = $0017;
     WM_SHOWWINDOW      = $0018;
    当隐藏或显示窗口是发送此消息给这个窗口
     WM_ACTIVATEAPP      = $001C;
    发此消息给应用程序哪个窗口是激活的,哪个是非激活的;
     WM_FONTCHANGE      = $001D;
    当系统的字体资源库变化时发送此消息给所有顶级窗口
     WM_TIMECHANGE      = $001E;
    当系统的时间变化时发送此消息给所有顶级窗口
     WM_CANCELMODE      = $001F;
    发送此消息来取消某种正在进行的摸态(操作)
     WM_SETCURSOR        = $0020;
    如果鼠标引起光标在某个窗口中移动且鼠标输入没有被捕获时,就发消息给某个窗口
     WM_MOUSEACTIVATE    = $0021;
    当光标在某个非激活的窗口中而用户正按着鼠标的某个键发送此消息给当前窗口
     WM_CHILDACTIVATE    = $0022;
    发送此消息给MDI子窗口当用户点击此窗口的标题栏,或当窗口被激活,移动,改变大小
     WM_QUEUESYNC        = $0023;
    此消息由基于计算机的训练程序发送,通过WH_JOURNALPALYBACK的hook程序
    分离出用户输入消息
     WM_GETMINMAXINFO    = $0024;
    此消息发送给窗口当它将要改变大小或位置;
    WM_PAINTICON        = $0026;
    发送给最小化窗口当它图标将要被重画
     WM_ICONERASEBKGND = $0027;
     此消息发送给某个最小化窗口,仅当它在画图标前它的背景必须被重画
     WM_NEXTDLGCTL      = $0028;
    发送此消息给一个对话框程序去更改焦点位置
     WM_SPOOLERSTATUS    = $002A;
    每当打印管理列队增加或减少一条作业时发出此消息
     WM_DRAWITEM        = $002B;
     当button,combobox,listbox,menu的可视外观改变时发送
    此消息给这些空件的所有者
     WM_MEASUREITEM      = $002C;
    当button, combo box, list box, list view control, or menu item 被创建时
    发送此消息给控件的所有者
     WM_DELETEITEM      = $002D;
    当the list box 或 combo box 被销毁 或 当 某些项被删除通过LB_DELETESTRING, LB_RESETCONTENT, CB_DELETESTRING, or CB_RESETCONTENT 消息
     WM_VKEYTOITEM      = $002E;
    此消息有一个LBS_WANTKEYBOARDINPUT风格的发出给它的所有者来响应WM_KEYDOWN消息 
     WM_CHARTOITEM      = $002F;
    此消息由一个LBS_WANTKEYBOARDINPUT风格的列表框发送给他的所有者来响应WM_CHAR消息 
     WM_SETFONT          = $0030;
    当绘制文本时程序发送此消息得到控件要用的颜色
     WM_GETFONT          = $0031;
    应用程序发送此消息得到当前控件绘制文本的字体
     WM_SETHOTKEY        = $0032;
    应用程序发送此消息让一个窗口与一个热键相关连
     WM_GETHOTKEY        = $0033;
    应用程序发送此消息来判断热键与某个窗口是否有关联
     WM_QUERYDRAGICON    = $0037;
    此消息发送给最小化窗口,当此窗口将要被拖放而它的类中没有定义图标,应用程序能
    返回一个图标或光标的句柄,当用户拖放图标时系统显示这个图标或光标
     WM_COMPAREITEM      = $0039;
    发送此消息来判定combobox或listbox新增加的项的相对位置
     WM_GETOBJECT        = $003D;
     WM_COMPACTING      = $0041;
    显示内存已经很少了
     WM_WINDOWPOSCHANGING = $0046;
    发送此消息给那个窗口的大小和位置将要被改变时,来调用setwindowpos函数或其它窗口管理函数
     WM_WINDOWPOSCHANGED = $0047;
    发送此消息给那个窗口的大小和位置已经被改变时,来调用setwindowpos函数或其它窗口管理函数
     WM_POWER            = $0048;(适用于16位的windows)
    当系统将要进入暂停状态时发送此消息
     WM_COPYDATA        = $004A;
    当一个应用程序传递数据给另一个应用程序时发送此消息
     WM_CANCELJOURNAL    = $004B;
    当某个用户取消程序日志激活状态,提交此消息给程序
     WM_NOTIFY          = $004E;
    当某个控件的某个事件已经发生或这个控件需要得到一些信息时,发送此消息给它的父窗口
     WM_INPUTLANGCHANGEREQUEST = $0050;
    当用户选择某种输入语言,或输入语言的热键改变
     WM_INPUTLANGCHANGE = $0051;
    当平台现场已经被改变后发送此消息给受影响的最顶级窗口
     WM_TCARD            = $0052;
    当程序已经初始化windows帮助例程时发送此消息给应用程序
     WM_HELP            = $0053;
    此消息显示用户按下了F1,如果某个菜单是激活的,就发送此消息个此窗口关联的菜单,否则就
    发送给有焦点的窗口,如果当前都没有焦点,就把此消息发送给当前激活的窗口
     WM_USERCHANGED      = $0054;
    当用户已经登入或退出后发送此消息给所有的窗口,当用户登入或退出时系统更新用户的具体
    设置信息,在用户更新设置时系统马上发送此消息;
     WM_NOTIFYformAT    = $0055;
    公用控件,自定义控件和他们的父窗口通过此消息来判断控件是使用ANSI还是UNICODE结构
    在WM_NOTIFY消息,使用此控件能使某个控件与它的父控件之间进行相互通信
     WM_CONTEXTMENU      = $007B;
    WM_styleCHANGING    = $007C;
    当调用SETWINDOWLONG函数将要改变一个或多个 窗口的风格时发送此消息给那个窗口
     WM_styleCHANGED    = $007D;
    当调用SETWINDOWLONG函数一个或多个 窗口的风格后发送此消息给那个窗口
     WM_DISPLAYCHANGE    = $007E;
    当显示器的分辨率改变后发送此消息给所有的窗口
     WM_GETICON          = $007F;
    此消息发送给某个窗口来返回与某个窗口有关连的大图标或小图标的句柄;
     WM_SETICON          = $0080;
    程序发送此消息让一个新的大图标或小图标与某个窗口关联;
     WM_NCCREATE        = $0081;
    当某个窗口第一次被创建时,此消息在WM_CREATE消息发送前发送;
     WM_NCDESTROY        = $0082;
    此消息通知某个窗口,非客户区正在销毁
     WM_NCCALCSIZE      = $0083;
    当某个窗口的客户区域必须被核算时发送此消息
     WM_NCHITTEST        = $0084;//移动鼠标,按住或释放鼠标时发生
     WM_NCPAINT          = $0085;
    程序发送此消息给某个窗口当它(窗口)的框架必须被绘制时;
     WM_NCACTIVATE      = $0086;
    此消息发送给某个窗口 仅当它的非客户区需要被改变来显示是激活还是非激活状态;
     WM_GETDLGCODE      = $0087;
    发送此消息给某个与对话框程序关联的控件,widdows控制方位键和TAB键使输入进入此控件
    通过响应WM_GETDLGCODE消息,应用程序可以把他当成一个特殊的输入控件并能处理它
     WM_NCMOUSEMOVE      = $00A0;
    当光标在一个窗口的非客户区内移动时发送此消息给这个窗口      file://非/客户区为:窗体的标题栏及窗                                                                   
                                                                 的边框体
     WM_NCLBUTTONDOWN    = $00A1;
    当光标在一个窗口的非客户区同时按下鼠标左键时提交此消息
     WM_NCLBUTTONUP      = $00A2;
    当用户释放鼠标左键同时光标某个窗口在非客户区十发送此消息;
     WM_NCLBUTTONDBLCLK = $00A3;
    当用户双击鼠标左键同时光标某个窗口在非客户区十发送此消息
     WM_NCRBUTTONDOWN    = $00A4;
    当用户按下鼠标右键同时光标又在窗口的非客户区时发送此消息
     WM_NCRBUTTONUP      = $00A5;
    当用户释放鼠标右键同时光标又在窗口的非客户区时发送此消息
     WM_NCRBUTTONDBLCLK = $00A6;
    当用户双击鼠标右键同时光标某个窗口在非客户区十发送此消息
     WM_NCMBUTTONDOWN    = $00A7;
    当用户按下鼠标中键同时光标又在窗口的非客户区时发送此消息
     WM_NCMBUTTONUP      = $00A8;
    当用户释放鼠标中键同时光标又在窗口的非客户区时发送此消息
     WM_NCMBUTTONDBLCLK = $00A9;
    当用户双击鼠标中键同时光标又在窗口的非客户区时发送此消息
     WM_KEYFIRST        = $0100;
    WM_KEYDOWN          = $0100;
    WM_MOUSEFIRST      = $0200;
     WM_MOUSEMOVE        = $0200; 
                     // 移动鼠标
     WM_LBUTTONDOWN      = $0201;
                       file://按/下鼠标左键
     WM_LBUTTONUP        = $0202;
                     file://释/放鼠标左键
     
     
     
    还有:
     
     WM_DEVICECHANGE    = 537;
    当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
     WM_IME_STARTCOMPOSITION        = $010D;
     WM_IME_ENDCOMPOSITION          = $010E;
     WM_IME_COMPOSITION            = $010F;
     WM_IME_KEYLAST                = $010F;
     WM_IME_SETCONTEXT              = $0281;
     WM_IME_NOTIFY                  = $0282;
     WM_IME_CONTROL                = $0283;
     WM_IME_COMPOSITIONFULL        = $0284;
     WM_IME_SELECT                  = $0285;
     WM_IME_CHAR                    = $0286;
     WM_IME_REQUEST                = $0288;
     WM_IME_KEYDOWN                = $0290;
     WM_IME_KEYUP                  = $0291;
     WM_MDICREATE        = $0220;
    应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口
     WM_MDIDESTROY      = $0221;
    应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
     WM_MDIACTIVATE      = $0222;
    应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到
    此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;
     WM_MDIRESTORE      = $0223;
    程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
     WM_MDINEXT          = $0224;
    程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
     WM_MDIMAXIMIZE      = $0225;
    程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;
     WM_MDITILE          = $0226;
    程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
     WM_MDICASCADE      = $0227;
    程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
     WM_MDIICONARRANGE = $0228;
    程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
     WM_MDIGETACTIVE    = $0229;
    程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
     WM_MDISETMENU      = $0230;
    程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
     WM_ENTERSIZEMOVE    = $0231;
     WM_EXITSIZEMOVE    = $0232;
     WM_DROPFILES        = $0233;
     WM_MDIREFRESHMENU = $0234;
     WM_MOUSEHOVER      = $02A1;
     WM_MOUSELEAVE      = $02A3;
     WM_CUT              = $0300;
    程序发送此消息给一个编辑框或combobox来删除当前选择的文本
     WM_COPY            = $0301;
    程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
     WM_PASTE            = $0302;
    程序发送此消息给editcontrol或combobox从剪贴板中得到数据
     WM_CLEAR            = $0303;
    程序发送此消息给editcontrol或combobox清除当前选择的内容;
     WM_UNDO            = $0304;
    程序发送此消息给editcontrol或combobox撤消最后一次操作
     WM_RENDERformAT    = $0305;
     WM_RENDERALLformATS = $0306;
     WM_DESTROYCLIPBOARD = $0307;
    当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
     WM_DRAWCLIPBOARD    = $0308;
    当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来
    显示剪贴板的新内容;
     
    WM_PAINTCLIPBOARD = $0309;
    当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画;
     WM_VSCROLLCLIPBOARD = $030A;
     WM_SIZECLIPBOARD    = $030B;
    当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;
     WM_ASKCBformATNAME = $030C;
    通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
     WM_CHANGECBCHAIN    = $030D;
    当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;
     WM_HSCROLLCLIPBOARD = $030E;
    此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 ;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;
    WM_MOUSEFIRST      = $0200;
     WM_MOUSEMOVE        = $0200; 
                     // 移动鼠标
     WM_LBUTTONDOWN      = $0201;
                       file://按/下鼠标左键
     WM_LBUTTONUP        = $0202;
                     file://释/放鼠标左键
     WM_LBUTTONDBLCLK    = $0203;
                     file://双/击鼠标左键
     WM_RBUTTONDOWN      = $0204;
                     file://按/下鼠标右键
     WM_RBUTTONUP        = $0205;
                     file://释/放鼠标右键
     WM_RBUTTONDBLCLK    = $0206;
                   file://双/击鼠标右键
     WM_MBUTTONDOWN      = $0207;
                   file://按/下鼠标中键
     WM_MBUTTONUP        = $0208;
                   file://释/放鼠标中键
     WM_MBUTTONDBLCLK    = $0209;
                     file://双/击鼠标中键
     WM_MOUSEWHEEL      = $020A;
    当鼠标轮子转动时发送此消息个当前有焦点的控件
     WM_MOUSELAST        = $020A;
     WM_PARENTNOTIFY    = $0210;
    当MDI子窗口被创建或被销毁,或用户按了一下鼠标键而光标在子窗口上时发送此消息给它的父窗口
     WM_ENTERMENULOOP    = $0211;
    发送此消息通知应用程序的主窗口that已经进入了菜单循环模式
     WM_EXITMENULOOP    = $0212;
    发送此消息通知应用程序的主窗口that已退出了菜单循环模式
     WM_NEXTMENU        = $0213;
     WM_SIZING          = 532;
    当用户正在调整窗口大小时发送此消息给窗口;通过此消息应用程序可以监视窗口大小和位置
    也可以修改他们
     WM_CAPTURECHANGED = 533;
    发送此消息 给窗口当它失去捕获的鼠标时;
     WM_MOVING          = 534;
    当用户在移动窗口时发送此消息,通过此消息应用程序可以监视窗口大小和位置
    也可以修改他们;
     WM_POWERBROADCAST = 536;
    此消息发送给应用程序来通知它有关电源管理事件;
     WM_DEVICECHANGE    = 537;
    当设备的硬件配置改变时发送此消息给应用程序或设备驱动程序
     WM_IME_STARTCOMPOSITION        = $010D;
     WM_IME_ENDCOMPOSITION          = $010E;
     WM_IME_COMPOSITION            = $010F;
     WM_IME_KEYLAST                = $010F;
     WM_IME_SETCONTEXT              = $0281;
     WM_IME_NOTIFY                  = $0282;
     WM_IME_CONTROL                = $0283;
     WM_IME_COMPOSITIONFULL        = $0284;
     WM_IME_SELECT                  = $0285;
     WM_IME_CHAR                    = $0286;
     WM_IME_REQUEST                = $0288;
     WM_IME_KEYDOWN                = $0290;
     WM_IME_KEYUP                  = $0291;
     WM_MDICREATE        = $0220;
    应用程序发送此消息给多文档的客户窗口来创建一个MDI 子窗口
     WM_MDIDESTROY      = $0221;
    应用程序发送此消息给多文档的客户窗口来关闭一个MDI 子窗口
     WM_MDIACTIVATE      = $0222;
    应用程序发送此消息给多文档的客户窗口通知客户窗口激活另一个MDI子窗口,当客户窗口收到
    此消息后,它发出WM_MDIACTIVE消息给MDI子窗口(未激活)激活它;
     WM_MDIRESTORE      = $0223;
    程序 发送此消息给MDI客户窗口让子窗口从最大最小化恢复到原来大小
     WM_MDINEXT          = $0224;
    程序 发送此消息给MDI客户窗口激活下一个或前一个窗口
     WM_MDIMAXIMIZE      = $0225;
    程序发送此消息给MDI客户窗口来最大化一个MDI子窗口;
     WM_MDITILE          = $0226;
    程序 发送此消息给MDI客户窗口以平铺方式重新排列所有MDI子窗口
     WM_MDICASCADE      = $0227;
    程序 发送此消息给MDI客户窗口以层叠方式重新排列所有MDI子窗口
     WM_MDIICONARRANGE = $0228;
    程序 发送此消息给MDI客户窗口重新排列所有最小化的MDI子窗口
     WM_MDIGETACTIVE    = $0229;
    程序 发送此消息给MDI客户窗口来找到激活的子窗口的句柄
     WM_MDISETMENU      = $0230;
    程序 发送此消息给MDI客户窗口用MDI菜单代替子窗口的菜单
     WM_ENTERSIZEMOVE    = $0231;
     WM_EXITSIZEMOVE    = $0232;
     WM_DROPFILES        = $0233;
     WM_MDIREFRESHMENU = $0234;
     WM_MOUSEHOVER      = $02A1;
     WM_MOUSELEAVE      = $02A3;
     WM_CUT              = $0300;
    程序发送此消息给一个编辑框或combobox来删除当前选择的文本
     WM_COPY            = $0301;
    程序发送此消息给一个编辑框或combobox来复制当前选择的文本到剪贴板
     WM_PASTE            = $0302;
    程序发送此消息给editcontrol或combobox从剪贴板中得到数据
     WM_CLEAR            = $0303;
    程序发送此消息给editcontrol或combobox清除当前选择的内容;
     WM_UNDO            = $0304;
    程序发送此消息给editcontrol或combobox撤消最后一次操作
     WM_RENDERformAT    = $0305;
     
     WM_RENDERALLformATS = $0306;
     WM_DESTROYCLIPBOARD = $0307;
    当调用ENPTYCLIPBOARD函数时 发送此消息给剪贴板的所有者
     WM_DRAWCLIPBOARD    = $0308;
    当剪贴板的内容变化时发送此消息给剪贴板观察链的第一个窗口;它允许用剪贴板观察窗口来
    显示剪贴板的新内容;
     WM_PAINTCLIPBOARD = $0309;
    当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区需要重画;
     WM_VSCROLLCLIPBOARD = $030A;
     WM_SIZECLIPBOARD    = $030B;
    当剪贴板包含CF_OWNERDIPLAY格式的数据并且剪贴板观察窗口的客户区域的大小已经改变是此消息通过剪贴板观察窗口发送给剪贴板的所有者;
     
    WM_ASKCBformATNAME = $030C;
    通过剪贴板观察窗口发送此消息给剪贴板的所有者来请求一个CF_OWNERDISPLAY格式的剪贴板的名字
     WM_CHANGECBCHAIN    = $030D;
    当一个窗口从剪贴板观察链中移去时发送此消息给剪贴板观察链的第一个窗口;
     WM_HSCROLLCLIPBOARD = $030E;
    此消息通过一个剪贴板观察窗口发送给剪贴板的所有者 ;它发生在当剪贴板包含CFOWNERDISPALY格式的数据并且有个事件在剪贴板观察窗的水平滚动条上;所有者应滚动剪贴板图象并更新滚动条的值;
    WM_QUERYNEWPALETTE = $030F;
    此消息发送给将要收到焦点的窗口,此消息能使窗口在收到焦点时同时有机会实现他的逻辑调色板
     WM_PALETTEISCHANGING= $0310;
    当一个应用程序正要实现它的逻辑调色板时发此消息通知所有的应用程序
     WM_PALETTECHANGED = $0311;
    此消息在一个拥有焦点的窗口实现它的逻辑调色板后发送此消息给所有顶级并重叠的窗口,以此
    来改变系统调色板
    WM_HOTKEY          = $0312;
    当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
     WM_PRINT            = 791;
    应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;
     WM_PRINTCLIENT      = 792;
     WM_HANDHELDFIRST    = 856;
     WM_HANDHELDLAST    = 863;
     WM_PENWINFIRST      = $0380;
     WM_PENWINLAST      = $038F;
     WM_COALESCE_FIRST = $0390;
     WM_COALESCE_LAST    = $039F;
     WM_DDE_FIRST        = $03E0;
     WM_DDE_INITIATE    = WM_DDE_FIRST + 0;
    一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;
     WM_DDE_TERMINATE    = WM_DDE_FIRST + 1;
    一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;
     WM_DDE_ADVISE      = WM_DDE_FIRST + 2;
    一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它
     WM_DDE_UNADVISE    = WM_DDE_FIRST + 3;
    一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项
     WM_DDE_ACK          = WM_DDE_FIRST + 4;
    此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息
     WM_DDE_DATA        = WM_DDE_FIRST + 5;
    一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项
     WM_DDE_REQUEST      = WM_DDE_FIRST + 6;
    一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;
     WM_DDE_POKE        = WM_DDE_FIRST + 7;
    一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项;
     WM_DDE_EXECUTE      = WM_DDE_FIRST + 8;
    一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应;
     WM_DDE_LAST        = WM_DDE_FIRST + 8;
     WM_APP = $8000;
     WM_USER            = $0400;
    此消息能帮助应用程序自定义私有消息;
    WM_HOTKEY          = $0312;
    当用户按下由REGISTERHOTKEY函数注册的热键时提交此消息
     WM_PRINT            = 791;
    应用程序发送此消息仅当WINDOWS或其它应用程序发出一个请求要求绘制一个应用程序的一部分;
     WM_PRINTCLIENT      = 792;
     WM_HANDHELDFIRST    = 856;
     WM_HANDHELDLAST    = 863;
     WM_PENWINFIRST      = $0380;
     WM_PENWINLAST      = $038F;
     WM_COALESCE_FIRST = $0390;
     WM_COALESCE_LAST    = $039F;
     WM_DDE_FIRST        = $03E0;
     WM_DDE_INITIATE    = WM_DDE_FIRST + 0;
    一个DDE客户程序提交此消息开始一个与服务器程序的会话来响应那个指定的程序和主题名;
     WM_DDE_TERMINATE    = WM_DDE_FIRST + 1;
    一个DDE应用程序(无论是客户还是服务器)提交此消息来终止一个会话;
     WM_DDE_ADVISE      = WM_DDE_FIRST + 2;
    一个DDE客户程序提交此消息给一个DDE服务程序来请求服务器每当数据项改变时更新它
     WM_DDE_UNADVISE    = WM_DDE_FIRST + 3;
    一个DDE客户程序通过此消息通知一个DDE服务程序不更新指定的项或一个特殊的剪贴板格式的项
     WM_DDE_ACK          = WM_DDE_FIRST + 4;
    此消息通知一个DDE(动态数据交换)程序已收到并正在处理WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, or WM_DDE_INITIAT消息
     WM_DDE_DATA        = WM_DDE_FIRST + 5;
    一个DDE服务程序提交此消息给DDE客户程序来传递个一数据项给客户或通知客户的一条可用数据项
     WM_DDE_REQUEST      = WM_DDE_FIRST + 6;
    一个DDE客户程序提交此消息给一个DDE服务程序来请求一个数据项的值;
     WM_DDE_POKE        = WM_DDE_FIRST + 7;
    一个DDE客户程序提交此消息给一个DDE服务程序,客户使用此消息来请求服务器接收一个未经同意的数据项;服务器通过答复WM_DDE_ACK消息提示是否它接收这个数据项;
     WM_DDE_EXECUTE      = WM_DDE_FIRST + 8;
    一个DDE客户程序提交此消息给一个DDE服务程序来发送一个字符串给服务器让它象串行命令一样被处理,服务器通过提交WM_DDE_ACK消息来作回应;
     WM_DDE_LAST        = WM_DDE_FIRST + 8;
     WM_APP = $8000;
     WM_USER            = $0400;
    此消息能帮助应用程序自定义私有消息;
     
    /
    通知消息(Notification message)是指这样一种消息,一个窗口内的子控件发生了一些事情,需要通
    知父窗口。通知消息只适用于标准的窗口控件如按钮、列表框、组合框、编辑框,以及Windows 95公
    共控件如树状视图、列表视图等。例如,单击或双击一个控件、在控件中选择部分文本、操作控件的
    滚动条都会产生通知消息。
       按扭
    B N _ C L I C K E D                        file://用/户单击了按钮
    B N _ D I S A B L E                        file://按/钮被禁止
    B N _ D O U B L E C L I C K E D    file://用/户双击了按钮
    B N _ H I L I T E                        file://用/户加亮了按钮
    B N _ PA I N T按钮应当重画
    B N _ U N H I L I T E加亮应当去掉
    组合框
    C B N _ C L O S E U P组合框的列表框被关闭
    C B N _ D B L C L K用户双击了一个字符串
    C B N _ D R O P D O W N组合框的列表框被拉出
    C B N _ E D I T C H A N G E用户修改了编辑框中的文本
    C B N _ E D I T U P D AT E编辑框内的文本即将更新
    C B N _ E R R S PA C E组合框内存不足
    C B N _ K I L L F O C U S组合框失去输入焦点
    C B N _ S E L C H A N G E在组合框中选择了一项
    C B N _ S E L E N D C A N C E L用户的选择应当被取消
    C B N _ S E L E N D O K用户的选择是合法的
    C B N _ S E T F O C U S组合框获得输入焦点
    编辑框
    E N _ C H A N G E编辑框中的文本己更新
    E N _ E R R S PA C E编辑框内存不足
    E N _ H S C R O L L用户点击了水平滚动条
    E N _ K I L L F O C U S编辑框正在失去输入焦点
    E N _ M A X T E X T插入的内容被截断
    E N _ S E T F O C U S编辑框获得输入焦点
    E N _ U P D AT E编辑框中的文本将要更新
    E N _ V S C R O L L用户点击了垂直滚动条消息含义
    列表框
    L B N _ D B L C L K用户双击了一项
    L B N _ E R R S PA C E列表框内存不够
    L B N _ K I L L F O C U S列表框正在失去输入焦点
    L B N _ S E L C A N C E L选择被取消
    L B N _ S E L C H A N G E选择了另一项
    L B N _ S E T F O C U S列表框获得输入焦点
    消息,就是指Wi n d o w s发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标、改变
    窗口尺寸、按下键盘上的一个键都会使Wi n d o w s发送一个消息给应用程序。
    消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。例如,
    对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标。这个记录类型叫做T M s g,它
    在Wi n d o w s单元中是这样声明的:
    t y p e
    TMsg = packed record
    hwnd: HWND; / /窗口句柄
    message: UINT; / /消息常量标识符
    wParam: WPA R A M // 32位消息的特定附加信息
    lParam: LPA R A M // 32位消息的特定附加信息
    time: DWORD; / /消息创建时的时间
    pt: TPoint; / /消息创建时的鼠标位置
    e n d
    消息中有什么?
    是否觉得一个消息记录中的信息像希腊语一样?如果是这样,那么看一看下面的解释:
    hwnd 32位的窗口句柄。窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数可
    视对象的句柄(窗口、对话框、按钮、编辑框等)。
    message 用于区别其他消息的常量值,这些常量可以是Windows单元中预定义的常量,也
    可以是自定义的常量。
    wParam 通常是一个与消息有关的常量值,也可能是窗口或控件的句柄。
    lParam 通常是一个指向内存中数据的指针。由于W P a r a m、l P a r a m和P o i n t e r都是3 2位的,
    因此,它们之间可以相互转换。
    熟悉Windows编程的人员都知道,Windows的API为程序员提供了大量的消息,约有200多个。在PowerBuilder中,系统将每个Windows消息作为事件传递给程序员处理,并且为大多数普通的事件提供了缺省处理。
    PowerBuilder在语句描绘器中为每一个标准的控件设定了一些常用事件,一般的编程人员基于这些事件就基本可以完成常见的操作。如果我们遇到事件的处理需要另外截获Windows的消息,我们可以在语句描绘器菜单的"Declare|UserEvent..."中加入一个新的事件,同时指出您所希望对应的Windows消息。
    Windows API的消息一般以两到三个字符的标识开始,这个标识标明了该消息的来源或对象。例如:pbm_active实际上对应的是WM_ACTIVATE,WM说明该
     
     
     
     
    另外有一个PB函数,不常用,但很有用
    SETLIBRARYLIST()
    适合模块化的开发
     
    PowerBulider数据窗口转MicroSoft Execl、Word程序源代码 
    一、f_cncharnum函数 f_cncharnum.srf
    $PBExportHeader$f_cncharnum.srf
    $PBExportComments$得到字符串中汉字或者双字节的个数
    global type f_cncharnum from function_object
    end type
     
    forward prototypes
    global function integer f_cncharnum (string aString)
    end prototypes
     
    global function integer f_cncharnum (string aString);
    //函数名: f_cncharnum
    //用途: 返回一个字符串中汉字的个数
    //输入: aString - string, 给定的字符串
    //返回值: li_num - Integer, 给定的字符串中汉字的个数
    //注意: 1. 此方法基于汉字的国标汉字库区位编码的有效性,不符合此编码的系统此函数无效!
    // 2. 若汉字串含有非汉字字符,如图形符号或ASCII码,则这些非汉字字符将保持不变.
    //例如: li_ret = f_cncharnum("摆渡人ferryman") li_ret = 3
     
    string ls_ch //临时单元
    string ls_SecondSecTable //存放所有国标二级汉字读音
    integer li_num = 0 //返回值
    integer i,j
     
    For i = 1 to Len(aString)
    ls_ch = Mid(aString,i,1)
    If Asc(ls_ch) >= 128 then //是汉字
    li_num++
    i = i+1
    End if
    Next
     
    Return li_num
     
    end function
     
     
    二、PBToExcel函数f_outputtoexcel_new.srf
     
    $PBExportHeader$f_outputtoexcel_new.srf
    global type f_outputtoexcel_new from function_object
    end type
     
    forward prototypes
    global function integer f_outputtoexcel_new (datawindow adw)
    end prototypes
     
    global function integer f_outputtoexcel_new (datawindow adw);
    //函数名:f_outputtoexcel_new
    //输入: adw - datawindow,指定的数据窗口
    //返回值: Integer
    constant integer ppLayoutBlank = 12
    OLEObject ole_object
    ole_object = CREATE OLEObject
     
    integer li_ret
     
    li_ret = ole_object.ConnectToObject("","Excel.Application")
    IF li_ret <> 0 THEN
    //如果Excel还没有打开,则新建。
    li_ret = ole_object.ConnectToNewObject("Excel.Application")
    if li_ret <> 0 then
    MessageBox('OLE错误','OLE无法连接!错误号:' + string(li_ret))
    return 0
    end if
    ole_object.Visible = True
    END IF
     
    pointer oldpointer
     
    oldpointer = SetPointer(HourGlass!)
     
    ole_object.Workbooks.Add
     
    long ll_colnum,ll_rownum
    string ls_value
     
    string ls_objects,ls_obj,ls_objs[],ls_objtag[]
    long ll_pos,ll_len,ll_num = 0
     
    ls_objects = trim(adw.Describe('datawindow.Objects'))
     
    do while (pos(ls_objects,"~t") > 0)
    ll_pos = pos(ls_objects,"~t")
    ll_len = ll_pos - 1
    ls_obj = left(ls_objects,ll_len)
    if (adw.Describe(ls_obj + '.type') = 'column' or &
    adw.Describe(ls_obj + '.type') = 'compute') and &
    (adw.Describe(ls_obj + '.band') = 'detail') and (ls_obj <> "asd") then
    ll_num += 1
    ls_objs[ll_num] = ls_obj
    ls_objtag[ll_num] = adw.Describe(ls_obj + '.tag')
    end if
    ls_objects = right(ls_objects,len(ls_objects) - ll_pos)
    loop
     
    //得到数据窗口数据的列数与行数(行数应该是数据行数 + 1)
    ll_colnum = ll_num
    ll_rownum = adw.rowcount() + 1
     
    string ls_colname
    integer i,j,k
    for i = 1 to ll_colnum
    //得到标题头的名字
    ls_value = ls_objtag[i]
    ole_object.cells(1,i).value = ls_value
    next
     
    string column_name
    for i = 2 to ll_rownum
    for j = 1 to ll_colnum
    column_name = ls_objs[j]
    if adw.Describe(column_name + '.type') = 'column' then
    ls_value = adw.Describe("Evaluate('LookupDisplay("+column_name+")',"+string(i - 1)+")")
    end if
    if adw.Describe(column_name + '.type') = 'compute' then
    ls_value = adw.Describe("Evaluate('" + adw.Describe(column_name + '.expression') + "',"+string(i - 1)+")")
    end if
    ole_object.cells(i,j).value = ls_value
    next
    next
     
    SetPointer(oldpointer)
     
    ole_object.disconnectobject()
    DESTROY ole_object
     
    return 1
    end function
     
    三、PBToWord函数f_outputtoword_new.srf
     
    $PBExportHeader$f_outputtoword_new.srf
    global type f_outputtoword_new from function_object
    end type
     
    forward prototypes
    global function integer f_outputtoword_new (datawindow adw)
    end prototypes
     
    global function integer f_outputtoword_new (datawindow adw);
    //函数名:f_outputtoword_new
    //输入: adw - datawindow,指定的数据窗口
    //返回值: Integer
    constant integer ppLayoutBlank = 12
    OLEObject ole_object
    ole_object = CREATE OLEObject
     
    integer li_ret
     
    li_ret = ole_object.ConnectToObject("","word.application")
    IF li_ret <> 0 THEN
    //如果Word还没有打开,则新建。
    li_ret = ole_object.ConnectToNewObject("word.application")
    if li_ret <> 0 then
    MessageBox('OLE错误','OLE无法连接!错误号:' + string(li_ret))
    return 0
    end if
    ole_object.Visible = True
    END IF
     
    long ll_colnum,ll_rownum
    constant long wdWord9TableBehavior = 1
    constant long wdAutoFitFixed = 0
    constant long wdCell = 12
    string ls_value
    pointer oldpointer
     
    oldpointer = SetPointer(HourGlass!)
     
    string ls_objects,ls_obj,ls_objs[],ls_objtag[]
    long ll_pos,ll_len,ll_num = 0
     
    ls_objects = trim(adw.Describe('datawindow.Objects'))
     
    do while (pos(ls_objects,"~t") > 0)
    ll_pos = pos(ls_objects,"~t")
    ll_len = ll_pos - 1
    ls_obj = left(ls_objects,ll_len)
    if (adw.Describe(ls_obj + '.type') = 'column' or &
    adw.Describe(ls_obj + '.type') = 'compute') and &
    (adw.Describe(ls_obj + '.band') = 'detail') and (ls_obj <> "asd") then
    ll_num += 1
    ls_objs[ll_num] = ls_obj
    ls_objtag[ll_num] = adw.Describe(ls_obj + '.tag')
    end if
    ls_objects = right(ls_objects,len(ls_objects) - ll_pos)
    loop
     
    //得到数据窗口数据的列数与行数(行数应该是数据行数 + 1)
    ll_colnum = ll_num
    ll_rownum = adw.rowcount() + 1
     
    ole_object.Documents.Add()
    ole_object.ActiveDocument.Tables.Add(ole_object.Selection.Range, ll_rownum, ll_colnum)
     
    string ls_colname
    integer i,j,k
     
    for i = 1 to ll_colnum
    //得到标题头的名字
    ls_value = ls_objtag[i]
    ole_object.Selection.TypeText(ls_value)
    for k = 1 to f_cncharnum(ls_value)
    ole_object.Selection.TypeBackspace()
    next
    ole_object.Selection.MoveRight(wdCell)
    next
     
    adw.setredraw(false)
    ole_object.Selection.MoveLeft(wdCell)
    string column_name
    for i = 2 to ll_rownum
    for j = 1 to ll_colnum
    column_name = ls_objs[j]
    if adw.Describe(column_name + '.type') = 'column' then
    ls_value = adw.Describe("Evaluate('LookupDisplay("+column_name+")',"+string(i - 1)+")")
    end if
    if adw.Describe(column_name + '.type') = 'compute' then
    ls_value = adw.Describe("Evaluate('" + adw.Describe(column_name + '.expression') + "',"+string(i - 1)+")")
    end if
    ole_object.Selection.MoveRight(wdCell)
    ole_object.Selection.TypeText(ls_value)
    for k = 1 to f_cncharnum(ls_value)
    ole_object.Selection.TypeBackspace()
    next
    next
    next
    adw.setredraw(true)
     
    constant long wdFormatDocument = 0
     
    SetPointer(oldpointer)
    //保存新建的文档
    if messagebox("保存","文档已经成功完成,是否保存?",Question!,YesNo!) = 1 then
    string docname, named
    integer value
     
    value = GetFileSaveName("选择文件",docname, named, "DOC","Doc Files (*.DOC), *.DOC")
     
    IF value = 1 THEN
    ole_object.ActiveDocument.SaveAs(docname, 0,False,"",True,"",False,False,False, False,False)
    end if
     
    end if
    //断开OLE连接
    Ole_Object.DisConnectObject()
    Destroy Ole_Object
     
    return 1
    end function
     
     
     
     
     
    PB实现自动升级程序
    string get_chz,init,dbtype
    string ls_AppPath1
    int li_ret
    string upgrade_file,upgrade_inf,new_ver_no
    ver_no="2002091301"
    ret_val='failed'
    if Handle(GetApplication()) = 0 then
       //messagebox("系统","你现在处在开发运行状态!")
    ls_apppath="d:/work/drawback"
    else
       //messagebox("系统","你现在处在执行文件运行状态!")
    ls_AppPath = Space (128)
       li_ret = GetModuleFileNameA (Handle (GetApplication ()), ls_apppath, 128)
       ls_apppath=left(trim(ls_apppath),len(trim(ls_apppath)) -8)
    end if
    //判断是否有更新版本的程序
     
    integer li_FileNum
    //upgrade_inf获取升级文件的版本号
    upgrade_inf=profilestring("drawback.ini","upgrade","inf",      "")
    upgrade_file=upgrade_inf + profilestring("drawback.ini","upgrade","file",      "")
    if FileExists ( upgrade_file ) then
    li_FileNum = FileOpen(upgrade_file,LineMode! ,Read!, Shared! , Replace!)
    FileRead ( li_FileNum, new_ver_no )
    fileclose(li_FileNum)
    if new_ver_no > ver_no then
    if messagebox("建议","本程序已经有更新版本("+new_ver_no+"),是否下载并安装?",question!,yesno!)=1 then
    if FileExists ( upgrade_inf + "setup.exe" ) then
    run( upgrade_inf + "setup.exe")
    halt;
    else
    messagebox("错误","更新程序setup.exe不可得,请检查网络或路径")
    end if
    end if
    end if
     
    end if
     
     
     
     
    File               Required for
    =====              ============
    PBVM80.DLL    All
    PBDWE80.DLL        DataWindows and DataStores
    PBRTC80.DLL          Rich Text
    PBTRA80.DLL         Database connection tracing
    PBIN780.DLL    INFORMIX I-Net 7
    PBIN980.DLL    INFORMIX I-Net 9
    PBMSS80.DLL         Microsoft SQL Server 6 and 7
    PBO7380.DLL          Oracle 7.3
    PBO8480.DLL          Oracle 8.0.4 and later
    PBO9080.DLL          Oracle9i and later
    PBDIR80.DLL          Sybase DirectConnect
    PBSYC80.DLL          Sybase Adaptive Server Enterprise CT-LIB
    PBSYJ80.DLL          Sybase Adaptive Server Enterprise CT-LIB for
                       EAServer deployment only
    PBJDB80.DLL        PowerBuilder JDBC DB Driver for Microsoft Java VM
                       and the Sun JRE 1.1, 1.2, or 1.3 Java VM
    PBODB80.DLL        PowerBuilder ODBC interface
    PBOLE80.DLL        PowerBuilder OLE DB interface
    WTWEBSPPRT80.DLL   Web targets error messages

    展开全文
  • 便携式电子设备电源管理系统设计

    千次阅读 2006-04-06 13:41:00
    移动电源的地位在便携式电子产品研究中历来十分重要,它是电子设备的生命源。本文设计了一种可应用于便携式电子设备上的电源管理系统,通过对电源电压进行实时监控,限制非法的大电流放电,并对可能的突发事故进行...

    移动电源的地位在便携式电子产品研究中历来十分重要,它是电子设备的生命源。本文设计了一种可应用于便携式电子设备上的电源管理系统,通过对电源电压进行实时监控,限制非法的大电流放电,并对可能的突发事故进行预测,给系统提供电源紧急报警信号,起到了降低整个系统的功率损耗,保护并延长电池使用寿命的重要作用。

     

    便携式电子设备系统构成

     

    图1:便携式电子设备系统构成。

    图2:工作模式切换规则。

    图3:镍氢电池在室温下不同倍率下的放电特性。

    图4:电源管理系统的系统构成。

    便携式电子设备系统构成如图1所示,图中AT89S52单片机作为整个系统的主控单元;传感器和A/D构成了整个系统的反馈单元;D/A、伺服驱动模块以及执行机构构成了系统的动作实现单元;电源管理系统则为以上所有单元提供能源。以上各个单元的工作模式及相互切换如图2所示:

     

    1. 待机模式

     

    除主控单元外,其它所有子单元均停止供电。如果在规定时间内用户没有执行任何操作,则整个系统自动断电,在断电之前系统自动复位,并把断电原因记录下来。

     

    2. 电量不足模式

     

    当电池电量降到设定值时,系统转入电量不足模式,从这个模式一开始,电源管理系统一方面禁止对电池可能造成破坏的大电流放电动作,另一方面向用户发出报警信息请求充电。如果在规定的时间里操作者没有做出充电响应,系统转入待机模式。

     

    3. 充电模式

     

    操作者按下充电按钮,电源开始充电,除主控单元和电源单元外,其它子系统均断电。当充电完成后,所有子系统重新被激活。

     

    4. 工作模式

     

    在工作模式下,所有子单元都处于供电状态。

    系统的各器件并不是全部由移动电源直接供电,根据不同电源电压需要,电源管理系统需要由DC-DC芯片对电池组输出电压进行变压处理。此外,为了提高整个设备的电源供电质量,可以在DC-DC后接入低压差线形稳压电源器(LDO)。

     

    电源管理系统设计

     

    1.移动电源的选择

     

    在便携式电子产品领域,一般采用化学电池作为移动电源。理想的电池应该具有十分高的能量密度、能够在放电过程中保持恒定的电压、内阻小以便具有快速放电能力、能够耐高温、可充电以及成本低等。但实际上没有一种电池可同时具备上述优点,这就要求设计人员根据实际任务的需要,选择一种合适的电池。可充电电池主要有铅酸蓄电池和碱性蓄电池两种。目前使用的镍镉(NiCd)、镍氢(NiMH)和锂离子(Li-Ion)电池都是碱性电池。

     

    a. 铅酸蓄电池

    铅酸电池由正负极板、隔板、电解液、安全阀、气塞、外壳等部分组成。正极板上的活性物质是二氧化铅(PbO2),负极板上的活性物质为海绵状纯铅(Pb)。电解液由蒸馏水和纯硫酸按一定比例配制而成。电池槽中装入一定密度的电解液后,由于电化学反应,正、负极板间会产生约为2.1V的电动势。

     

    b. 镍镉电池

     

    镍镉电池(NiCd)正极板上的活性物质由氧化镍粉和石墨粉组成,石墨不参加化学反应,其主要作用是增强导电性。负极板上的活性物质由氧化镉粉和氧化铁粉组成,氧化铁粉的作用是使氧化镉粉有较高的扩散性,防止结块,并增加极板的容量。活性物质分别包在穿孔钢带中,加压成型后即成为电池的正负极板。极板间用耐碱的硬橡胶绝缘棍或有孔的聚氯乙烯瓦楞板隔开。电解液通常用氢氧化钾溶液。与其它电池相比,NiCd电池的自放电率(即电池不使用时失去电荷的速率)适中,但在使用过程中存在记忆效应,这使得电池存储容量无法被充分利用。

     

    图5:电压传感器原理。

    图6:施密特触发器输入输出电压波型及传输特性。

    图7:施密特触发器。

    图8:采样延迟校验原理。

    图9:电源管理程序流程图。

    表1:镍氢电池参数。

     

    c. 镍氢电池

    镍氢电池(NiMH)正极板材料为NiOOH,负极板材料为吸氢合金。电解液通常用30%的KOH水溶液,并加入少量的NiOH。隔膜采用多孔维尼纶无纺布或尼龙无纺布等。NiMH电池有圆柱形和方形两种。

     

    NiMH电池具有较好的低温放电特性,即使在-20℃环境温度下,采用大电流(以1C放电速率)放电,放出的电量也能达到标称容量的85%以上。但是,NiMH电池在高温(+40℃以上)时,蓄电容量将下降5~10%。这种由于自放电(温度越高,自放电率越大)而引起的容量损失是可逆的,几次充放电循环就能恢复到最大容量。NiMH电池的开路电压为1.2V,与NiCd电池相同。

     

    d. 锂离子充电电池

     

    锂离子电池用LiCoO2复合金属氧化物在铝板上形成阳极,用锂碳化合物在铜板形成阴极,极板间插入有亚微米级微孔的聚烯烃薄膜隔板,电解液为有机溶剂。

    锂电池易受到过充电、深放电以及短路的损害。单体锂离子电池的充电电压必须严格限制。充电速率通常不超过1C,最低放电电压为2.7~3.0V,如再继续放电则会损坏电池。

    综合这几种电池的优缺点,本文选择镍氢电池作为便携式电子设备的移动电源。镍氢电池的放电特性参照图3。

     

    本文选用电池的型号和参数如表1所示。共使用60节,每20节串联成一组,三组并联;输出电压24V;额定容量:Q=2.16X105mAh;电池质量:M=3Kg;电池的尺寸和组合规则有关。

     

    2.电源管理系统构成

     

    电源管理系统构成如图4所示,图中电池模块由三组镍氢电池组成,并单独输出,即Port1、Port2以及Port3,其中Port1负责给动作实现单元供电,Port2负责给反馈单元供电,Port3负责给主控单元供电。所有供电通道的关断都是通过可控硅来实现的。

     

    3.电压传感器的设计

     

    a. 电压传感器的功能要求 电源管理系统启动后,电压传感器对电源电压进行实时监测,当电源电量降低到设定值时,电压传感器能够发送TTL电平信号到单片机,通知单片机电源电量不足。

     

    b. 电压传感器原理

    从前面镍氢电池放电特性可以看出,随着电池电量的降低,电池的输出电压会相应的降低。因此,只要对电源的电压进行监测,就可以间接对电源的电量进行监测。

     

    如图5所示,电压传感器核心是一片LM339-四电压比较器,通过电阻R1和R2对电池电压进行采样,然后将采得的信号输入比较器的负输入端。当电源电量降到电压传感器设定值Vref时,LM339就会触发输出TTL电平信号,并将这些信号直接传送给单片机的I/O口,单片机通过对这些信号分析处理判断电源电量是否不足。如果不足,单片机会通过放大电路控制可控硅关断,进而切换各个子系统的工作模式。由于LM339有四个独立的比较器,所以理论上它可以同时对四组电池进行监控,本文只用到其中的三个。

     

    提高电源管理系统抗干扰能力

     

    镍氢电池在放电过程中,当负载骤然增大的时候,会引起电压暂时性急剧下降,这时电池电量可能没有低到需要充电的值比较器就触发了,这种负载干扰会严重影响电源管理系统对电池电量的判断。采用以下两种处理方法,可以有效地抑制负载干扰。

     

    1. 上采用施密特触发电路

     

    其原理如图6所示,在比较器的基础上加一个反馈电阻Rf,就构成了施密特触发器,下面对施密特触发器进行分析。

     

    施密特触发器跳变的临界条件是集成运放两个输入端之间的电压等于零,即:


    u-=u+(1)

     

    而在u-=u+时,集成运放两个输入端的电流均可视为零,因此运放反向输入端的电压等于输入电压,即


    u-=ui (2)

     

    而运放同相输入端的电位是:


    (3)

     

    因为Eq1时对应的Ui值就是阈值,故由公式(2)和公式(3)可知图4电路的阈值是:


    (4)


    (5)

     

    由以上分析可知,施密特电路由于反馈电阻Rf的存在,在其输入输出特性曲线上产生了一个滞迴区,如图3-5所示,当输入信号因干扰发生变化时,只要变化量不超过两个阈值之差,施密特触发器的输出电压就不会来回变化。由电压传感器原理图可知:

    ,代入公式(4)、(5)可得:


     

    由以上分析可知,当干扰使电源电压波动差值小于500mV时,电压传感器仍能输出正确的信号给计算机,所以施密特电路可以降低电源管理系统误信号产生的概率,增强系统的抗干扰能力。

     

    2. 上采用延时校验

     

    延时校验原理如图8所示,根据概率学原理,如果每次采样信号为误信号的机率相等,记为η,则采用n次延迟校验可把机率降低到,显然采用延迟校验的方法也可以明显地提高系统的抗干扰能力。

     

    电源管理程序流程图

     

    电源管理程序流程图如图9所示。图中Warming1、Warming2、Warming3代表三组电

    池的状态,如果等于1表示电源电量不足,等于0说明电源正常。通过对ExitProgram赋值,主程序可以控制电源管理程序的调用和退出。

     

    本文小结

     

    移动电源对于便携式电子设备而言至关重要,本文从经济性和实用性的角度出发设计了一套简单易行的电源管理方案。根据检测电源输出电压可间接获知电源电量的理论,以LM339比较器和AT89S52单片机为核心搭建了电源智能管理系统所必需的硬件结构,并在此基础上设计出电源管理程序流程图,从而有效地实现了对移动电源的管理,提高了整个系统的供电质量,保证了它的稳定运行。

     

    作者:曹会宾

    应用工程师

    哈尔滨圣邦微电子有限公司

    展开全文
  • 作为电子商务企业,淘宝和其他公司的业务对一致性和可用性的要求高于分区容错性,数据总量庞大且逐步增加,单位时间内的数据更新量并不大,但实时性要求很高。这些需求建议我们提供一套更加偏重于支持CA特性的系统,...
  • 电力电子变换器:PWM策略与电流控制技术 带目录 2016年机械工业出版社出版的图书,作者是艾瑞克·孟麦森(EricMonmasson) 译者序 引言 第1章用于两电平三相电压型逆变器的载波脉宽调制1 1.1引言1 1.2参考电压va ref、...
  • 电力电子变换器:PWM策略与电流控制技术 带目录 2016年机械工业出版社出版的图书,作者是艾瑞克·孟麦森(EricMonmasson) 译者序 引言 第1章用于两电平三相电压型逆变器的载波脉宽调制1 1.1引言1 1.2参考电压va ref、...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    《数据结构 1800题》 第一章 绪论 一、选择题 1. 算法的计算量的大小称为计算的(B )。【北京邮电大学2000 二、3 (20/8分)】 A.效率 B. 复杂性 C. 现实性 D. 难度 2. 算法的时间复杂度取决于(C )...
  • 磁盘逻辑结构

    千次阅读 2014-03-18 20:10:31
    1.1 硬盘的外部结构/1.2 硬盘的内部结构 一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标、型号、序列号、生产日期、容量、参数和主从设置方法等。这些信息是正确使用硬盘的基本依据,下面将逐步...
  • 电子病历文本编辑器

    万次阅读 2015-06-28 11:32:34
    前言 受chisc.net网站的邀请,特撰此文,一家之言,如果有不妥,敬请指出。   作者简介 袁永福,2001年东南大学毕业,从事IT十多年,2008年度微软MVP,著书立说。现在南京从事电子病历编辑器相关...EMRE是电子病历系
  • 电子组件可靠性现状分析!显然,在设计基本确定的情况下,焊接工艺可靠性和物料质量是影响产品可靠性最为关键的两个要素。二 焊接工艺质量评估技术焊接工艺过程:电子组件制造过程...
  • 全面理解电子邮件

    万次阅读 2018-10-16 21:03:55
    电子邮件系统的组成 传统电子邮件系统 一个电子邮件系统应具有三个主要组成部分:用户代理、邮件服务器、邮件发送协议(如SMTP)与邮件读取协议(如POP)。 用户代理(User Agent)就是用户与电子邮件系统的接口,...
  • 期刊:Energy &...柔性压电材料是可穿戴电子设备,医疗感知设备的关键。目前嵌入地位陶瓷填料的精细陶瓷-聚合物混合物料尽管有机械柔性,但是由于很差的负载转换比(load-transfer efficiency),该比值与聚...
  • 数据结构习题--线性表

    千次阅读 2016-02-28 15:22:25
    1.下述哪一条是顺序存储结构的优点?( )【北方交通大学 2001 一、4(2分)】 A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的...
  • 区块链在电子病历存储的应用 电子病历 概念 电子病历通常用电子设备(计算机、健康卡等)保存、管理、传输和重现的数字化的医疗记录,用以取代手写纸张病历,其内容包括纸张病历的所有信息。 ...
  • 实验一 线性表 一、实验目的 掌握线性表的逻辑结构特性以及在计算机内的两种存储结构。...2.线性表链存储结构下基本操作的实现(初始化、建表、取值、插入、删除、归并等)。 3.使用链式结构实现...
  • 本设计由桥压力传感器将重力转换成电压信号,然后通过HX711进行放大和模数转换成数字信号传送给STC89C52进行数字信号处理,以等价转换成重力并显示出来,同时具有计价功能,具有功能多、功耗低、系统设计简单、...
  • 而是使用一种称作FP树的紧凑数据结构组织数据,并**直接从该结构中提取频繁项集**。 基本思想: 首先:将代表频繁项集的数据库压缩到FP树上 其次:将FP树划分为一组条件数据库(每个数据数据库关联一个频繁项或...
  • 葵花宝典之数据结构1800T--2

    千次阅读 2012-09-09 09:40:11
    1.下述哪一条是顺序存储结构的优点?( )【北方交通大学 2001 一、4(2分)】 A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的...
  • 数据结构1800试题(第2章)

    千次阅读 2012-04-05 15:57:54
    1.下述哪一条是顺序存储结构的优点?( )【北方交通大学 2001 一、4(2分)】 A.存储密度大 B.插入运算方便 C.删除运算方便 D.可方便地用于各种逻辑结构的存储表示 2.下面关于线性表的叙述中,错误的是...
  • 两层结构与三层结构

    千次阅读 2013-01-04 16:50:22
    两层结构与三层结构  长期以来,我们一直使用着"客户端/服务器"的两层结构,这种两层的结构曾让无数人为之兴奋和惊叹,即客户端提供用户界面、处理业务逻辑,数据库服务器接受客户端SQL语句并对数据库进行查询,...
  • 电子/硬件工程师手册

    千次阅读 2020-01-17 10:09:29
    2、坚持采用开放的硬件架构,把握硬件技术的主流和未来发展,在设计中考虑将来的技术升级。 3、充分利用公司现有的成熟技术,保持产品技术上的继承性。 4、在设计中考虑成本,控制产品的性能价格比达至最优。 5、...
  • 介绍了用Si(Li)探测器作探头的携带高分辨合金分析仪的结构原理和实测结果。其仪器的分析范围可覆盖Ag,Cd,sn,sb,Ti,V,Cr,Mn,Fe,Co,Ni,Cu,Zn,As,Se,Hf,Au,Ta,w,Pb,Bi,Zr,Nb和Mo等元素。采用...
  • 深入解析硬盘结构

    千次阅读 2013-06-14 12:53:45
    1.1 硬盘的外部结构一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标、型号、序列号、生产日期、容量、参数和主从设置方法等。这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义。硬盘...
  • 在我们的生活与工作中所使用到的计算机都...冯诺依曼结构起源于EDVAC(Electronic Discrete Variable Automatic Computer)离散变量自动电子计算机,当时冯诺依曼以技术顾问的身份加入EDVAC项目组,负责总结和详细说明ED...
  • 卫星对时系统(北斗卫星对时系统)京准电子使用手册 卫星对时系统(北斗卫星对时系统)京准电子使用手册 卫星对时系统 使用手册   目 录 装置的用途及特点 1 1.1 用途 1 1.2 特点 1 技术指标 3 2.1 物理参数 3 2.2...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,791
精华内容 1,516
关键字:

pb的电子结构式