怎样用delphi访问 Automation (OLE/COM)对象?假如要访问某一OLE类(已知道它的类名),我怎样该类有那些方法和属性呢?
(delphi 帮助文当中能找到吗?)
---------------------------------------
您的帮助 我真心感谢!!

解决方案 »

  1.   

    //从超级猛料上摘录,希望有点用如果你正在了解如何通过自动化技术访问Microsoft Office程序或是其它程序,你非常幸运。我研究该问题有一段时间了,在这里与大家分享,以下有几个大家需要明白的问题,首先,有几种OLE方法访问1. early binding早期绑订,我理解为,在代码编译时就已经了解你需要操作何种类型的OLE对象,代码效率要高于以下两种方式。这需要使用到type library,(Project/ Imports TypeLibrary 或者安装ActiveX控件也可以),为了给大家有所比较,以下给出一个打开Access程序的代码。uses Windows, ComObj, ActiveX, Access_TLB;varAccess: _Application;Unknown: IUnknown;Result: HResult;beginResult := GetActiveObject(CLASS_AccessApplication, nil, Unknown);{Delphi 5}{Result := GetActiveObject(CLASS_Application_, nil, Unknown);}{Delphi 4}if (Result = MK_E_UNAVAILABLE) then beginAccess := CoAccessApplication.Create ; {Delphi 5}{Access := CoApplication_.Create ;} {Delphi 4}endelse beginOleCheck(Result);OleCheck(Unknown.QueryInterface(_Application, Access));end;Access.Visible := True;...end ; 2. late binding后期绑订,使用IDispatch接口,代码编译时并不了解你所需要操作的对象是什么,程序运行过程中(Runtime)才实现和OLE服务器的真正连接,所有变量使用Variant类型,代码性能应该较差(仅仅猜测)。但是这种方式代码较为简单易懂,易于自己编写复杂的控制。以下是一个同样打开Access程序的代码。varAccess: Variant;begintryAccess := GetActiveOleObject('Access.Application');exceptAccess := CreateOleObject('Access.Application');end;Access.Visible := True;...end; 3. 使用 Delphi5 的 server components这个方式我就不用多说了。打开一个Access程序,代码如下...AccessApplication1.Connect;AccessApplication1.Visible := True;AccessApplication1.OpenCurrentDatabase('C:.mdb',True);...另外,给大家说明一点,OLE Automatic不仅仅可以对Office系列程序进行操作,支持ActiveX的程序都可以被访问,比如,你可能可以使用ShellExecute & Ex、CreateProcess或是WinExec(Win16函数,尽量不使用)函数,启动 IE 进程,但是,你如果需要近一步的控制,试试用下面的代码。uses Comobj, ... ... ;{...}varForm1: TForm1;IEApp: Variant;{...}procedure TForm1.Button1Click(Sender: TObject);beginIEApp := 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;beginIEApp.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 IEIEApp.FullName := Full Path to IEIEApp.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;constxlWBATWorksheet = -4167;varRow, Col: integer;GridPrevFile: string;XLApp, Sheet: OLEVariant;beginResult := false;XLApp := CreateOleObject('Excel.Application');tryXLApp.Visible := False;XLApp.Workbooks.Add(xlWBatWorkSheet);Sheet := XLApp.Workbooks[1].WorkSheets[1];Sheet.Name := 'My Sheet Name';for col := 0 to StringGrid.ColCount - 1 dofor row := 0 to StringGrid.RowCount - 1 doSheet.Cells[row + 1,col + 1] := StringGrid.Cells[col, row];tryXLApp.Workbooks[1].SaveAs(FileName);Result := True;exceptend;finallyif not VarIsEmpty(XLApp) thenbeginXLApp.DisplayAlerts := False;XLApp.Quit;XLAPP := Unassigned;Sheet := Unassigned;end;end;end; procedure TForm1.Button1Click(Sender: TObject);beginIf SaveAsExcelFile(StringGrid1,'c:.xls') thenShowMessage('StringGrid saved!');end; 同样的方式你可以打开CorelDraw文档并进行源码级的操作,打开WinFax为自己自动发送传真。....MyCorelDraw := CreateOleObject('CorelDraw.Automation.8');....MyWinFax := CreateOleObject('WinFax.SDKSend');....自动化技术包罗万千,实在不是一个简单篇幅能够给你说清楚的,我将自动化技术的核心技术介绍了一下,自动化技术其实只是Delphi给出接口( xxxx_TLB.pas - 这种typelibarary文件已经有com对象的详细接口、属性和方法列表 ),接口相应的实现全部是由应用程序来完成的。让所有注册的应用程序为你所用,你甚至可以开发一个超级的文件查看器,可以查看甚至操作PhotoShop、Microsoft Office、CorelDraw、AutoCAD、Visio、PDF文档等等等等。Microsoft几乎将所有软件变成了ActiveX、或是ActiveX容器,这是一个跨开发平台的策略,无论VB、VC、Delphi或者其它的开发平台,只要支持ActiveX就可以使用,传统的API开发已经是越来越...唉... 奉劝大家需要多多研究和学习这种新型的开发模式。我对此的研究到此为止,如果朋友有什么心得和补充,也请不吝赐教。