2006年3月31日

Borland传奇(六)

OLE的搅局

不知道是时运不济或是Microsoft的刻意如此,在1994年Borland C/C++和Visual C/C++决战的前夕,Microsoft推出了OLE(Object Linking And Embedding)技术。OLE是Microsoft为了对抗Apple的文件技术以及IBM OS2的Workplace和文件技术应运而生的。OLE可以让Window平台的文件能够内嵌在不同的应用程式中并且能够让文件在应用程式中被即地编辑(In-Place Editing)。说实在的,Microsoft的OLE和Apple以及IBM的技术比较起来实在是差多了,OLE在稍后也被证明是失败的技术,不过不管是Microsoft的OLE或是Apple/IBM的文件技术也都是失败的技术,都没有造成巨大的成功。虽然这些文件技术都没有成功,但是OLE却足以成为Borland,Symantec和Watcom失败的重要因素。

我还记得当时OLE似乎成为了一个令人趋之若鹜的时髦功能,因为Word的文件能够内嵌在Excel之中,并且可以点选此Word文件,应用程式又立刻成为Word来编辑它,实在是令人觉得非常的神奇。不过在其时所有的软体厂商中只有Microsoft的应用程式有如此的功能,其他的厂商例如Lotus,WordPerfect等都无法实作出这种功能。这造成了不公平的竞争,因为OLE技术是由作业系统厂商Microsoft推出的,但是却让它的应用程式部门同步拥有这种技术,而其他的软体厂商都无法获得第一手的OLE技术来实作,这是为什么当时其他的软体厂商如此火大的原因。

虽然后来其他的软体公司在取得了OLE的技术资讯之后也推出了具备OLE功能的应用程式,但是毕竟是慢了Microsoft许久,市场也流失了许多。不过我也很奇怪的是在当时内建OLE功能的应用程式之中,几乎所有的软体厂商推出的应用程式在启动数个应用程式而且使用OLE之后,就非常容易的当掉,只有Microsoft的应用程式不太会发生这种情形,因此许多人便认为Microsoft有隐瞒一些技术没有让其他的厂商知道。

由于OLE是如此的复杂,因此Borland无法立刻在OWL之中实作出这种功能,于是就造成了市场上负面的影响。至于Symantec和Watcom虽然是License MFC,但是在其时它们License的是MFC 1.x的版本,Microsoft并没有把OLE实作在MFC 1.x中,而是在实作在MFC 2.0之中。在MFC 2.0推出时最重要的功能就是Microsoft加入了20000多行支援OLE的程式码,但是MFC 2.0却仅限于Visual C/C++使用,就是这关键的一点让其他三家厂商吃了亏。

对于OLE这个关键技术的影响,Borland是深知在心的,因此在计划在Borland C/C++ 4.5的OWL 2.5中支援OLE。当时Borland推出的解决方案便是OCF(Object Component Framework)。

Borland当初在设计OCF时有几个重大的目标。这些目标包括了: 一、如何能够使得OLE琐碎 、复杂的介面能够单纯化; 第二、如何能够使得OLE在视窗环境下写程式的思考方式 一致化--即使用「事件驱动」的方法。第三、如何能够在微软占尽天时、地利(未必人和) 的情况下使得Borland的产品具备OLE的功能。第四、如何能够让大多数C++的程式师都能够享受OLE的功能而不局限于OWL的程式师。由于上述的设计目标, 而造就了典雅而具有弹 性的OCF。由于OCF本身是一完整而独立的Framework, 因此它可适用于各种应用程式发展Framework。

不晓得各位使用过Borland C/C++的朋友们是否还依稀记得下图OCF的架构图之一,以及下面的OCF范例程式码,这些可是我把1994年写的文章挖出来之后找到的,真是令我感慨,也回想起了当时的情景,也让各位回忆一下OWL和OCF。对于不熟悉OWL和OCF的朋友,也可以从下图和程式码中观察一下当时的技术以及设计的概念。基本上我现在看这些图形架构,会发现它们并没有落后现在太多,可见当时设计者的功力(Carl Quinn Again)。

 //
 // Insert an OLE object into the view
 //
void TOleWindow::CmEditInsertObject()
{

    PRECONDITION(OcView);

    TOcInitInfo initInfo(OcView);

    if (OcApp->Browse(initInfo))

    {

        TRect rect;

        GetInsertPosition(rect);

        SetSelection(new TOcPart(*GetOcDoc(), initInfo, rect));

        OcView->Rename();

        InvalidatePart(invView);

    }

}

程式1 OWL的TOleWindow支援OLE插入物件之成员函数

//
// Handle left double-click message
//
void TOleWindow::EvLButtonDblClk(uint modKeys, TPoint& point)

{

    PRECONDITION(GetOcDoc() && GetOcView());

    TOleClientDC dc(*this);

    dc.DPtoLP(&point);

    TOcPart* p = GetOcDoc()->GetParts().Locate(point);

    if (modKeys & MK_CONTROL)
    {
        if (p)
            p->Open(true); // Ctrl key forces open editing
    }
    else
    {

        SetSelection(p);

        if (p && p == GetOcView()->GetActivePart())
        { // resync the active flag
            p->Activate(false);
        }

        GetOcView()->ActivatePart(p); // In-place activation

    }

}

程式2 OWL的TOleWindow支援左键双击之成员函数


    虽然Borland及时的在OWL 2.5中加入了OLE的支援,无奈Microsoft随后又在OLE中加入了许多其他的功能,因此让OCF并无法完整的支援OLE所有的功能,Borland又无法不断的延后Borland C/C++的推出,因此在1994年末,Borland终于推出了决战的4.5版本。


 
 

没有评论: