请教各位DFW:纯API建立的线程处理EXCEL表格,为什么会有内存问题? (100分)

L

La Mer

Unregistered / Unconfirmed
GUEST, unregistred user!
uses ShellAPI 。。。;

function thd_StartExporting(p:pointer):Longint;overload;
var dc : HDC;
i : integer;
DestFileName : string;
begin
Result:=0;
dc:=GetDc(frm_Main.handle);
Application.Initialize;
OleInitialize(nil);
with frm_Maindo
begin
xls_App.Workbooks.Open('。。。',
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,
EmptyParam,EmptyParam,0);
xls_Book.ConnectTo(xls_App.Workbooks[1]);
xls_Sheet.ConnectTo(xls_Book.Sheets[1] as _WorkSheet);
try
。。。
finally
xls_Book.Close;
xls_Sheet.Disconnect;
xls_Book.Disconnect;
xls_App.Disconnect;
xls_App.Quit;
end;
// try
end;
// with frm_Maindo
ReleaseDc(frm_Main.handle,dc);
end;

procedure Tfrm_Main.btn_StartClick(Sender: TObject);
begin
HD:=CreateThread(nil,0,@thd_StartExporting,nil,0,ThID);
end;

只要一运行这个线程就出错:Access violation at address 0049B7C2 in module 'EXCEL_Exporter.exe' of address 0000001D.
可爱的是,“确定”之后,程序还一样能照常运行。
请问如何想办法有效去掉这个错误(提示)?谢谢!
② 还有个小问题顺便请教一下:怎么用API函数判断这种纯API现成到底有没有结束?
 
好像没有必要用县城处理EXCEL表
 
一般是没有必要,但是要一次性处理上千个文件的读写而又不导致其他工作因此停顿,我觉得就可能有必要了。
 
thd_StartExporting(p:pointer):Longint;stdcall;
而且你要初始化COM库才行,建议你用TTHREAD类
 
谢谢,用过了,后来才改成overload的。
我觉得TThread类比较麻烦,声明、实现都得一段一段地写。
我觉得上面的问题是不是variant的关系?EXCEL里通篇都是OLE Variant
哦,忘了写,我已经 uses comObj 了。
 
顶部