想实现的功能是将数据库中的通讯录导出存为EXCEL格式。我先做好功能封装成DLL,然后供ASP。NET调用,因为DLL无法调试,我又做了一个应用程序,从DLL工程中COPY关键代码。然而运行时,应用程序可以执行成功,而DLL调用时,    try
        ExcelApp :=CreateOleObject( 'Excel.Application' );
    except
        result :='服务器上没有安装EXCEL组件,请联系管理员,谢谢!';
        exit;
    end;
处抱错。代码其实都是一模一样的,难道应用程序和DLL,执行环境要求不同?

解决方案 »

  1.   

    完整代码如下:
    {*==========================================================================*
     *             Function: exData
     *                Param: userid用户ID
     *                   dbcnnt数据库连接参数
     * Description: 处理传入的用户ID和组ID,生成相应的通讯录文件(.cvs)
     *==========================================================================*}
    function exData(userid,groupid,dbcnnt:string):string;
    var
    stmt,fileName :string;
    userName,mobile,homePhone,workPhone,exterssion,conttent :string;
    ExcelApp,sheet: Variant;//EXCEL对象
    iRow :integer;
    begin
        try //初始化数据库连接
            ADOConnectionMain:=TADOConnection.Create(Application);
            ADOCommandMain:=TADOCommand.Create(Application);
            ADODataSetMain:=TADODataSet.Create(Application);
            ADODataSetMain.Connection:=ADOConnectionMain;
            ADOCommandMain.Connection:=ADOConnectionMain;
            ADOConnectionMain.ConnectionString:=dbcnnt;
            ADOConnectionMain.Open;
        except
            result:='初始化数据库连接失败,无法继续。';
            exit;
        end;    try
            ExcelApp :=CreateOleObject( 'Excel.Application' );
        except
            result :='服务器上没有安装EXCEL组件,请联系管理员,谢谢!';
            exit;
        end;
        
        ExcelApp.Visible := False;
        ExcelApp.DisplayAlerts := False;
        ExcelApp.workbooks.add(1);
        sheet:=ExcelApp.workbooks[1].worksheets['sheet1'];
        sheet.name:='个人通讯录';
        sheet.Cells.item[1,1]:='姓名';
        sheet.Cells.item[1,2]:='手机';
        sheet.Cells.item[1,3]:='备注'; //完成EXCEL表格的设计(创建/表头填写)    stmt :='SELECT * FROM contactInfo WHERE userid='+userid;    ADODataSetMain.CommandText:=stmt;
        try
            iRow :=2;//从第二行开始填写EXCEL表格
            ADODataSetMain.Open;
            while not ADODataSetMain.Eof do
            begin
                sheet.Cells.item[iRow,1] :=Trim(ADODataSetMain['name']);         // 联系人姓名
                sheet.Cells.item[iRow,2] := Trim(ADODataSetMain['m_phone']);     // 手机
                sheet.Cells.item[iRow,3] := Trim(ADODataSetMain['comment']);     // 备注
                iRow :=iRow +1;
            end;
            
            ADOConnectionMain.Close;
            ADOCommandMain.Free;
            ADODataSetMain.Free;
            ADOConnectionMain.Free;       
            sheet.SaveAs(userid+'.csv' );
            
            try//释放EXCEL
                ExcelApp.WorkBooks.Close;
                ExcelApp.Quit;
            except
            end;
        except
            result :='发生未知错误,无法继续。';
        end;
    end;
      

  2.   

    你可能没在DLL中调用CoInitialize。COM对象需要调用这个函数,在Exe中Delphi自动调用,在DLL中必须自己调用。
      

  3.   

    snowfog(秋风舞) ,怎么调用CoInitialize。COM对象,我来试试。
    还有我对比了应用程序和DLL,发现应用程序中有:implementation
    uses ComObj;而DLL中无法加入这么一行代码啊。
      

  4.   

    你可以这样写:(在单元的结尾部分)
    initialization
      CoInitizlize();
    finallization
      CoUninitialize();
      

  5.   

    在dll代码的最先,调用 CoInitialize(nil), 最后,退出前,调用CoUninitialize;
    要 uses ActiveX; 
    dll中无所谓interface,implementation,你直接在uses 中加如就可!
      

  6.   

    不行啊,还是        ExcelApp :=CreateOleObject( 'Excel.Application' );
        except
            result :='服务器上没有安装EXCEL组件,请联系管理员,谢谢!';
            exit;
        end;
    出错
      

  7.   

    出什么错,写出来?是不是机器上确实没有安装Excel?
      

  8.   

    其实,你用F1Book,服务器上是否安装Excel都无所谓。另:你直接用ActiveX,让它自己加载DLL,而且,COM的初始化那块,你也不用去处理 :)
      

  9.   

    try
            ExcelApp :=CreateOleObject( 'Excel.Application' );
            CreateOleObject
        except
             on e:exception do
             begin
                result :=e.message;
                exit;
            end;
    返回的是“拒绝访问”
      

  10.   

    我也调用 CoInitialize(nil),但还是出错啊
      

  11.   

    你试试从开始菜单打开Excel是否可以?
      

  12.   

    gz  我也建议你用F16Book
      

  13.   

    拒绝访问,是什么意思啊。好象和CoInitialize(nil),没有关系了,因为如果我不CoInitialize(nil),的话,他抱的错是:未调用 CoInitialize。