宗文's profile方寸之间PhotosBlogLists Tools Help

Blog


    March 27

    网页中OCX控件HWND为空问题

    当网页中的OCX控件没有出现到屏幕上之前(或者尺寸为0时),它的WM_CREATE消息将不会被调用. 这样当script程序调用一些必须要有有效HWND的操作时就会导致MFC/ATL底层库的崩溃(调试版本则会ASSERT)。
     
    在MFC中的调试版本:
    ASSERT(::IsWindow(m_hWnd));
     
    在ATL中的调试版本:
    ATLASSERT(::IsWindow(m_hWnd));
     
    MFC的解决办法是:在派生类中钩住OnSetClientSite,创建一个窗口,代码如下:
    // CMyControl is derived from COleControl.
    void CMyControl::OnSetClientSite()
    {
      // It doesn't matter who the parent window is or what the size of
      // the window is because the control's window will be reparented
      // and resized correctly later when it's in-place activated.
      if (m_pClientSite)
        VERIFY (CreateControlWindow (::GetDesktopWindow(), CRect(0,0,0,0), CRect(0,0,0,0)));
      COleControl::OnSetClientSite();
    }
    ATL的解决办法:
    // CMyControl is derived from CComControl
    STDMETHOD(SetClientSite)(IOleClientSite *pClientSite)
    {
      if (pClientSite)
      {
        RECT rc = {0,0,0,0};
        // Don't have access to the container's window so just use the
        // desktop.  Window will be resized correctly during in-place
        // activation.
        HWND hWnd = CreateControlWindow(::GetDesktopWindow(), rc);
        _ASSERT (hWnd);
      }
      return IOleObjectImpl<CMyControl>::SetClientSite (pClientSite);
    }
    HRESULT InPlaceActivate(LONG iVerb, const RECT* prcPosRect)
    {
      // Get the container's window.
      _ASSERT (m_spClientSite);
      LPOLEINPLACESITE pInPlaceSite = NULL;
      HRESULT hr = m_spClientSite->QueryInterface(IID_IOleInPlaceSite, (void**)&pInPlaceSite);
      _ASSERT (SUCCEEDED (hr) && pInPlaceSite);
      HWND hParent = NULL;
      hr = pInPlaceSite->GetWindow (&hParent);
      _ASSERT (SUCCEEDED (hr) && hParent);
      pInPlaceSite->Release ();
      // Set container window as our parent window
      SetParent (hParent);
      return CComControlBase::InPlaceActivate(iVerb, prcPosRect);
    }
     
    本文摘自Microsoft原始文档 http://support.microsoft.com/kb/195188/en-us ,略有翻译。
    March 12

    数学中的悖论(1)-分球定理

    如果有人说,你能将一个地球那么大的东西分解成若干(有限)个部分,然后将这些部分分别经过多次旋转或者平移(都是刚性的,不做任何变形),重新拼接在一起竟然可以变得像乒乓球那么大,你是不是觉得不可思议呢?
     
    1924年,Banach-Tarski提出并证明的分球定理恰恰保证了这一点。该定理说:一个球U可以分解为两个不相交的集合X和Y的并,使得U全等于X,也全等于Y。两个集合全等就是说这两个集合可以分别分解为相同数目的有限个不相交的子集的并,其中对应的两个子集可以经旋转和平移完全重合。多次运用分球定理,当然就可以让地球这么大的东西全等于小小乒乓球啦。可谓“藏须弥于芥子”啊。
     
    这个极度违背人们日常常识的东西竟然是数学的定理?!是的,令人惊讶,但它与所有其它的数学结论都没有任何矛盾。有时候,常识也未必像你想象的那样永远可靠呢。
     
    简单的说,这个结论和大家的常识不一致的根本原因是两个集合虽然全等,但有可能它们都没有办法定义符合常识的体积(不是说体积为0哦,而是没有办法定义体积)。所以虽然地球和乒乓球全等,但它们的体积还是可以很悬殊的。
    March 11

    梁启超《清代学术概论》札记2

    (3)“盖无论何人之言,决不肯漫然置信,必求其所以然之故;常从众人所不注意处觅得间隙,既得间,则层层逼拶,直到尽头处;苟终无足以起其信者,虽圣哲父师之言不信也。”
     
    (4)吾乡前辈大师戴震:“不以人蔽己,不以己自蔽”,“传信不传疑”,“知十而皆非真,不若知一之为真知也。”
     
    最后一句话,实在令人深思啊!如果日积月累积累真知,全人类的知识就会逐渐增长,不会陷入“生住异灭”的循环。
     
    (5)还是戴震:“尊者以理责卑,长者以理责幼,贵者以理则贱,虽失之谓顺;卑者幼者贱者以理争之,虽得谓之逆。于是下之人不能以天下之同情、天下之同欲达之与上;上者以理责其下,而在下之罪,人人不胜指数。人死于法,犹有怜之者;死于理,其谁怜之!”
     
    (6)康有为《大同书》:“无家族,男女同栖不得逾一年,届期须易人。”
     
    柏拉图《理想国》,马克思对家庭都有类似这样的想法,看来这些哲人的乌托邦都对付不了家庭导致的私心。这样违背人性的东西也只能在乌托邦中存在。
     
    (7)“故吾所恶乎舞文贱儒,动以西学缘附中学者,以其名为开新,实则保守,煽思想界之奴性而滋益之也。”“摭古书片词单语以傅会今义,最易发生两种流弊。一、倘所印证之义,其表里适相吻合,善已;若稍有牵合附会,则最易导国民以不正确之观念,而缘郢书燕说以滋弊。……”
     
    (8)“今后欧美科学,日日输入,我国民用其遗传上极优粹之科学的头脑,凭借此等丰富之资料,将来必可成为全世界第一等的‘科学国民’。”
     
    梁氏八九十年前的这个预言,看来基本落空了。实际上,我国国民目前迫切需要的,还是科学的启蒙,科学的普及。我国民中少数优粹的科学的头脑被淹没于无所不在的非理性不重实证的传统文化之中。梁氏以为的中国文艺复兴--清代朴学在中国实际上起到的作用和文艺复兴相去甚远,其原因还待我们思索。
     
    (9)“……物质文明烂熟,而‘精神上之饥饿’益不胜其苦痛。佛教哲学,盖应于此时代要求之一良药也。”
     
    梁氏此语,大谬也。且与他所肯定的(3)(4)(7)等条自相矛盾,也说明梁氏文章,热情鼓吹很是动人,但不以说理见长。
     
    精神上的饥饿,不必须要信仰某种宗教或哲学来治疗。让我引用柯南翻译的Richard Dawkings的《科学是一种宗教吗?》(http://www.oursci.org/magazine/200505/0512.htm)的两段话说明这一点:
     
    “提供安慰对科学而言更困难。和宗教不同,科学不能让人们和他们所爱的人在死后团圆。从科学的观点看,这个世界上被损害的人,无法期待伤害到他们的人来世会遭到大快人心的因果报应。我们可以争辩说,如果来生的说法是虚幻的(我相信它是虚幻的),它所提供的安慰是虚伪的。但是这还不够,倘若人们永远没有发现它是虚妄的,一个虚假的信念能够和一个真实的信念一样提供安慰。但是如果安慰来的那么廉价,科学也能提供其他的廉价手段,例如止痛片。这些手段提供的安慰或许是或者不是幻觉,但是它们确实有效。
     
    “然而,科学确实能做到振奋人心。所有大的宗教都为崇敬、对奇迹和宇宙之美的赞叹留下了空间。令人颤抖和喘气的崇敬——几乎是膜拜——心中对奇迹的赞叹,这些正是科学可以提供的。它远远超越了圣徒和神秘主义者最疯狂的梦想。超自然在我们(对世界的)解释中没有任何位置的这一事实、我们对宇宙和生命如此丰富的理解,并没有减少敬畏。正相反,仅仅在显微镜下一瞥蚂蚁的大脑,或者从望远镜中一瞥拥有10亿个世界的古老星系,就足够让井底之蛙式的赞美诗相形见绌。”
     
    精神上的饥饿,只能通过疑问、求真、创造加以消解。
    March 02

    梁启超《清代学术概论》札记1

    (1)“佛说一切流转相,例分四期,曰:生、住、异、灭。”
     
    梁氏借此说明所有学说或思潮,分为启蒙期(生)、全盛期(住)、蜕分期(异)、衰落期(灭)。这个说法有些武断了。凡科学学说,一旦被实验证实,则基本上永远保持其正确性,只是有可能在扩大使用范围时会出错。比如牛顿力学,比如生物进化论。数学也基本上不会衰落,只有协调和完备与否的问题。那些不可实证的学说则有可能适合梁氏的说法,比如梁氏论及的清代学术,又比如心理学,还比如绝大多数所谓社会科学。
     
    (2)“凡事物之含有宗教性者,例不许作为学问上研究之问题。一作为问题,其神圣之地位固已摇动矣!”
     
    此言说得好!其实,又有什么不可以研究的问题呢?欧洲的启蒙运动正是从试图讨论那些教会不允许的问题开始的。所谓“人文主义”,说到底就是以人为中心,破一切神圣的东西。目前“中华文化”“老祖宗”就是这样神圣的东西。有以“中华文化”作为挡箭牌拒绝对风水啦、中医啦等进行科学研究的,岂不谬哉!
     

    福建游-引子-福州三坊七巷

    从2.19(初二)开始到2.28结束,走过了大半个福建省。
     
    2.19(初二) 北京飞福州,当天下午坐火车去武夷山。中间正好有点时间,花了一个多小时简单逛了逛三坊七巷。名人故居很多,有林则徐母家故居,还有我们老校长的父亲严复先生的故居。《天演论》等名著就是严复先生翻译的,“物竞天择,适者生存”就是他老人家翻译自然选择时的用词。他们应该是输入西方现代科学的第一代人。多少年过去了,英雄和狗熊都成为尘土,只有有生命力的弥因(meme)永远流传下来。