|
楼主 |
发表于 2004-7-22 18:18:03
|
显示全部楼层
OLE的搅局
不知道是时运不济或是Microsoft的刻意如此,在1994年Borland C/C++和Visual C/C++决战的前夕,Micro-
soft推出了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虽然是LicenseMFC,但是在其时它们License的是MFC 1.x的版本,Microsoft并没有把OLE
实作在MFC 1.x中,而是在实作在MFC2.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()
{
001 PRECONDITION(OcView);
002 TOcInitInfo initInfo(OcView);
003 if (OcApp->Browse(initInfo)) {
004 TRect rect;
005 GetInsertPosition(rect);
006 SetSelection(new TOcPart(*GetOcDoc(), initInfo, rect));
007 OcView->Rename();
008 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年未,Bor-
land终於推出了决战的4.5版本。 |
|