忘了写问题了 呵呵
在buttonclick 里直接处理写过程还能执行(虽然出了一堆非法错误),而buttonclick 调用这个动态连接库则完全不执行,一点就出Fetal error access violation address 0x0000000!!!
在buttonclick 里直接处理写过程还能执行(虽然出了一堆非法错误),而buttonclick 调用这个动态连接库则完全不执行,一点就出Fetal error access violation address 0x0000000!!!
uses
ShareMem,
SysUtils,
Classes,
Windows,
Db,
Excel2000,
OleServer, OleCtrls;
Comobj;//引用
{$R *.res}procedure IntoExl(app1:TComponent;DataSet1:TDataSet;FileName1,Title:string);stdcall;
var
ExcelApplication1:TExcelApplication;
ExcelWorksheet1:TExcelWorksheet;
ExcelWorkbook1:TExcelWorkbook;
i,j:integer;
filename:string;
Sheet:Variant;
begin
filename:=concat(filename1,'.xls');
try //建立Excel 对象
ExcelApplication1.Create(app1);
ExcelWorksheet1.Create(app1);
ExcelWorkbook1.Create(app1);
ExcelApplication1.Connect;
except
MessageBox(0,'Excel2000 未安装!','错误',mb_ok+mb_iconerror);
abort;
end; try //建立Excel 表
ExcelApplication1.Workbooks.Add(EmptyParam,0);
Excelworkbook1.ConnectTo(ExcelApplication1.ActiveWorkbook); Excelworksheet1.ConnectTo(Excelworkbook1.Activesheet as _worksheet);
sheet:=ExcelWorkBook1.ActiveSheet;
DataSet1.First;
for j:=0 to DataSet1.Fields.Count - 1 do
begin
sheet.Cells.item[3,j + 1] := DataSet1.Fields[j].DisplayLabel;
sheet.Cells.item[3, j + 1].font.size := '10';
end; for i := 4 to DataSet1.RecordCount + 3 do
begin
for j := 0 to DataSet1.Fields.Count - 1 do
begin
sheet.Cells.item[i, j + 1] :=DataSet1.Fields[j].Asstring;
sheet.Cells.item[i, j + 1].font.size := '10';
end;
DataSet1.Next;
end; sheet.Columns.AutoFit;
sheet.Cells.item[1, 2] := Title;
sheet.Cells.Item[1, 2].font.size := '14';
sheet.SaveAs(filename);
Messagebox(0,PChar('数据成功导出!' + filename), '提示',mb_Ok); finally
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
ExcelApplication1.Free;
ExcelWorksheet1.Free;
ExcelWorkbook1.Free; end;
end;exports
IntoExl ;begin
end.
...Comobj,Excel2000, OleServer;
type
TForm1 = class(TForm)
...
Button1: TButton;
ExcelApplication1: TExcelApplication;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
...
implementation{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;begin ExcelApplication1.Create(Application);
...以上是在button click 直接写处理过程,执行中没有问题,用 try except 也发现不了问题,但一关闭程序 就会出现“ '0x004064f6'指令引用'0x000035c'内存。该内存不能为'read' 。”
及'Application error'.
不过动态连接库还是不行,exception( Excel2000 未安装!), 怀疑是声明的问题 在直接处理时是在Form 中加了关于Excel的几个组件(Delphi 6提供的servers page 中office2k的控制组件),而在dll中不能直接加组件,自己声明的好像有问题吧? 搞不清楚library DataSetIntoExl;
uses
ShareMem,
SysUtils,
Classes,
Windows,
Db,
comobj,
Excel2000,
OleServer,
OleCtrls;{$R *.res}procedure IntoExl(DataSet1:TDataSet;FileName1,Title:string);stdcall;
var
ExcelApplication1:TExcelApplication;
ExcelWorksheet1:TExcelWorksheet;
ExcelWorkbook1:TExcelWorkbook;
i,j:integer;
filename:string;
begin
filename:=concat(filename1,'.xls');
try //建立Excel 对象 ExcelApplication1.Connect;
except
MessageBox(0,'Excel2000 未安装!','错误',mb_ok+mb_iconerror);
abort;
end; try //建立Excel 表
ExcelApplication1.Workbooks.Add(EmptyParam,0);
哪位高手,调试调试那个dll,没办法只好把form 改成dll 了