请问各位高手,怎样才能在线程当中完全释放掉Execel!(100分)

  • 主题发起人 主题发起人 bensonhe
  • 开始时间 开始时间
B

bensonhe

Unregistered / Unconfirmed
GUEST, unregistred user!
最近小弟接到一个任务,就是要把数据库中的数据转到Execl当中,一下就是代码:
var ExcelApp: Variant;
begin
try
try
ExcelApp := CreateOleObject( 'Excel.Application' );
ExcelApp.WorkBooks.Open( ExtractFilePath(Application.ExeName)+'Excel/dg_data.xls');
ExcelApp.Visible := True;
ExcelApp.WorkSheets[1].Activate;
ExcelApp.Cells[2,3].Value :=ADOTable1.FieldByName('StationName').AsString ;
ExcelApp.Cells[6,2].Value :=ADOTable1.FieldByName('StationName').AsString ;
。。。。

ExcelApp.ActiveSheet.PrintPreview;
ExcelApp.ActiveWorkBook.Saved := True;
// ExcelApp.WorkBooks.Close;
// ExcelApp.Quit;
except
MessageBox(handle,'你的计算机没有安装Excel,或者模板文件不存在!','错误',MB_OK+MB_ICONERROR);
//showmessage(ExtractFilePath(Application.ExeName)+'Excel/dg_data.xls');
end;
finally
ExcelApp.WorkBooks.Close;
ExcelApp.Quit;
ExcelApp :=UnAssigned;
end;

开始的时候我一切都很顺利,但是运行了一段时间以后,按Del+Alt+Ctrl就发现原来Excel根本没有释放,
最后搞到系统出现内存不够.我现在正在苦恼,不知道怎样才能真正释放掉Excel,我用的是Win98!
请各位高手帮帮忙!谢谢!
 
關閉excel是用quit沒錯,一般excel沒有正常關閉是出現了異常沒執行quit.
你在finally裡面quit之前還有一句ExcelApp.WorkBooks.Close;
如果這一句產生錯誤那麼excel就不能關閉了
 
这个问题,你不是问过了吗?也解答过你了,怎么还问?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1320025

http://www.delphibbs.com/delphibbs/dispq.asp?lid=1296713
 
终止进程
转(leebons)

下面是我写的一段源代码,只要你把你想要终止的程序名(包括路径)写入
D:/Program Files/text1.txt这个文件中(注意每行写一个程序名).那么这个
程序无法运行下去.程序里有详细的注释.祝你好运!
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,tlhelp32,stdCtrls, ExtCtrls;//注意加上tlhelp32这个单元;
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
Timer1: TTimer;
ListBox2: TListBox;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
procedure processlist(var prolist:tlist);//自定义函数列举所有的进程;
procedure exitcode ;//自定义函数终止进程;
{ Private declarations }
public
{ Public declarations }
end;
type tproinfo=record
filename:string;
proid:dword;
end;proinfo=^tproinfo;//自定义记录用来记录进程的文件名和ID;

var
Form1: TForm1;
curr:tlist;
temp,b,a1:integer;
implementation

{$R *.DFM}


procedure TForm1.processlist(var prolist: tlist);
var p:proinfo;
ok:bool;
prolisthandle:thandle;
prostruct:tprocessentry32; //记录进程的数据结构;
begin
prolist:=tlist.Create ;
prolist.Clear ;
prolisthandle:=createtoolhelp32snapshot(th32cs_snapprocess,0);
prostruct.dwSize :=sizeof(prostruct);
ok:=process32first(prolisthandle,prostruct);//发现第一个进程;
while integer(ok)<>0 do
begin
new(p);
p.filename :=prostruct.szExeFile ;
p.proid :=prostruct.th32ProcessID ;
prolist.Add (p);
ok:=process32next(prolisthandle,prostruct);//发现下一个进程;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
var
a:string;
f:textfile;
begin
listbox1.Clear;
listbox2.Clear;
if fileexists('D:/Program Files/text1.txt') then
begin //该文件记录你所想禁止运行的程序的路径;
assignfile(f,'D:/Program Files/text1.txt');
reset(f);
while not eof(f) do
begin
readln(f,a);
a:=uppercase(a); //转化成大写字母;
listbox2.Items.Add (a); //记录所有被禁止运行程序的路径;
end;
closefile(f)
end
else application.Terminate ;

end;


procedure Tform1.exitcode;
var h:thandle;
a:dword;
p:proinfo;

begin
begin
p:=curr.items; //指向禁止运行的进程的数据结构;
h:=openprocess(process_all_access,true,p.proid);
getexitcodeprocess(h,a); //得到进程退出代码;
terminateprocess(h,a) ; //终止进程
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
p:proinfo;
begin
listbox1.Clear ;
processlist(curr); //调用进程列举的函数;
for i:=0 to curr.Count-1 do
begin
new(p);
p:=curr.Items;
listbox1.Items.Add(p.filename); //记录所有的进程的路径;
end; //listbox2是记录所有禁止运行的程序的路径;
for i:=0 to listbox2.Items.Count-1 do
if (listbox1.Items.IndexOf(listbox2.Items.Strings)>=0) then
begin
b:=listbox1.Items.IndexOf(listbox2.Items.Strings);
exitcode;//调用终止进程的函数;
end;
end;
end.
 
后退
顶部