首页  编辑  

COM/OLE/ActiveX [ Dragon P.C ]

Tags: /超级猛料/COM、ActiveX,DDE/COM_ DCOM/   Date Created:
如果你正在了解如何通过自动化技术访问Microsoft Office程序或是其它程序,你非常
幸运。我研究该问题有一段时间了,在这里与大家分享,以下有几个大家需要明白的问
题,
首先,有几种OLE方法访问
1. early binding
   早期绑订,我理解为,在代码编译时就已经了解你需要操作何种类型的OLE对象,
代码效率要高于以下两种方式。这需要使用到type library,(Project/ Imports Type
Library 或者安装ActiveX控件也可以),为了给大家有所比较,以下给出一个打开
Access程序的代码。
 uses Windows, ComObj, ActiveX, Access_TLB;
 var
   Access: _Application;
   Unknown: IUnknown;
   Result: HResult;
 begin
   Result := GetActiveObject(CLASS_AccessApplication, nil, Unknown);
{Delphi 5}
   {Result := GetActiveObject(CLASS_Application_, nil, Unknown);}
{Delphi 4}
   if (Result = MK_E_UNAVAILABLE) then begin
     Access := CoAccessApplication.Create ;  {Delphi 5}
     {Access := CoApplication_.Create ;}     {Delphi 4}
   end
   else begin
     OleCheck(Result);
     OleCheck(Unknown.QueryInterface(_Application, Access));
   end;
   Access.Visible := True;
   ...
 end ;
2. late binding
   后期绑订,使用IDispatch接口,代码编译时并不了解你所需要操作的对象是什
么,程序运行过程中(Runtime)才实现和OLE服务器的真正连接,所有变量使用Variant
类型,代码性能应该较差(仅仅猜测)。但是这种方式代码较为简单易懂,易于自己编写
复杂的控制。以下是一个同样打开Access程序的代码。
var
  Access: Variant;
begin
  try
    Access := GetActiveOleObject('Access.Application');
  except
    Access := CreateOleObject('Access.Application');
  end;
  Access.Visible := True;
        ...
end;
3. 使用 Delphi5 的 server components
   这个方式我就不用多说了。打开一个Access程序,代码如下
   ...
   AccessApplication1.Connect;
   AccessApplication1.Visible := True;
AccessApplication1.OpenCurrentDatabase('C:\Office\Samples\Northwind.mdb',
True);
   ...
另外,给大家说明一点,OLE Automatic不仅仅可以对Office系列程序进行操作,支持
ActiveX的程序都可以被访问,比如,你可能可以使用ShellExecute & Ex、
CreateProcess或是WinExec(Win16函数,尽量不使用)函数,启动 IE 进程,但是,
你如果需要近一步的控制,试试用下面的代码。
uses Comobj, ... ... ;
{...}
var
 Form1: TForm1;
 IEApp: Variant;
{...}
procedure TForm1.Button1Click(Sender: TObject);
begin
IEApp := CreateOLEObject('InternetExplorer.Application');
IEApp.visible := true;
IEApp.Top := 0;
IEApp.Left := 0;
IEApp.width := screen.width;
IEApp.height := screen.height;
IEApp.Navigate('http://www.swissdelphicenter.ch');
end;
procedure TForm1.Closed;
begin
 IEApp.quit;
end;
IE的其它的控制:
 IEApp.GoForward ;
 IEApp.GoBack ;
 IEApp.GoHome ;
 IEApp.Refresh ;
 IEApp.Stop ;
 IEApp.GoHome ;
 IEApp.FullScreen  := true;
 IEApp.StatusText  := 'My Status Text';
 IEApp.Path        := Show Path to IE
 IEApp.FullName    := Full Path to IE
 IEApp.LocationURL := Get active Url
不仅仅IE,以下有一些访问其它OLE容器的例子:
http://community.borland.com/article/0,1410,10194,00.html 访问AutoCAD的例子
http://www.wideman-one.com/gw/tech/Visio/delphi/index.htm 访问Visio的例子
http://bukoo.sourceforge.net 一位国人创建了该项目,旨在通过Automatic编程实现
Macromedia Flash的swf文件制作、编辑和播放,有兴趣的朋友可以和版主联系参加该
项目。
以下的函数代码实现将StringGrid存储为Excel文档
function SaveAsExcelFile(StringGrid: TStringGrid; FileName: string):
boolean;
const
 xlWBATWorksheet = -4167;
var
 Row, Col:     integer;
 GridPrevFile: string;
 XLApp, Sheet: OLEVariant;
begin
 Result := false;
 XLApp := CreateOleObject('Excel.Application');
 try
   XLApp.Visible := False;
   XLApp.Workbooks.Add(xlWBatWorkSheet);
   Sheet      := XLApp.Workbooks[1].WorkSheets[1];
   Sheet.Name := 'My Sheet Name';
   for col := 0 to StringGrid.ColCount - 1 do
     for row := 0 to StringGrid.RowCount - 1 do
       Sheet.Cells[row + 1,col + 1] := StringGrid.Cells[col, row];
   try
     XLApp.Workbooks[1].SaveAs(FileName);
     Result := True;
   except
   end;
 finally
   if not VarIsEmpty(XLApp) then
   begin
     XLApp.DisplayAlerts := False;
     XLApp.Quit;
     XLAPP := Unassigned;
     Sheet := Unassigned;
   end;
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 If SaveAsExcelFile(StringGrid1,'c:\MyExcelFile.xls') then
    ShowMessage('StringGrid saved!');
end;
同样的方式你可以打开CorelDraw文档并进行源码级的操作,打开WinFax为自己自动发
送传真。
....
MyCorelDraw := CreateOleObject('CorelDraw.Automation.8');
....
MyWinFax := CreateOleObject('WinFax.SDKSend');
....
自动化技术包罗万千,实在不是一个简单篇幅能够给你说清楚的,我将自动化技术的核
心技术介绍了一下,自动化技术其实只是Delphi给出接口( xxxx_TLB.pas - 这种type
libarary文件已经有com对象的详细接口、属性和方法列表 ),接口相应的实现全部是
由应用程序来完成的。让所有注册的应用程序为你所用,你甚至可以开发一个超级的文
件查看器,可以查看甚至操作PhotoShop、Microsoft Office、CorelDraw、AutoCAD、
Visio、PDF文档等等等等。Microsoft几乎将所有软件变成了ActiveX、或是ActiveX容
器,这是一个跨开发平台的策略,无论VB、VC、Delphi或者其它的开发平台,只要支持
ActiveX就可以使用,传统的API开发已经是越来越...唉... 奉劝大家需要多多研究和
学习这种新型的开发模式。我对此的研究到此为止,如果朋友有什么心得和补充,也请
不吝赐教。