I
import
Unregistered / Unconfirmed
GUEST, unregistred user!
如果你正在了解如何通过自动化技术访问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:.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:.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开发已经是越来越...唉... 奉劝大家需要多多研究和
学习这种新型的开发模式。我对此的研究到此为止,如果朋友有什么心得和补充,也请
不吝赐教。
幸运。我研究该问题有一段时间了,在这里与大家分享,以下有几个大家需要明白的问
题,
首先,有几种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:.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:.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开发已经是越来越...唉... 奉劝大家需要多多研究和
学习这种新型的开发模式。我对此的研究到此为止,如果朋友有什么心得和补充,也请
不吝赐教。