窗体上有一个保存控件.是用于把数据导入Excel表中.编译成可执行文件,保存时正常.但是做成dll.保存时报地址错.其它的控件都正常

解决方案 »

  1.   

    这种情况下,最好贴出DLL代码!
    在DLL内,初始化COM了吗?
      

  2.   

    library AllQuy;uses
      ShareMem, Forms, SysUtils, Classes,
      AllQuery in 'AllQuery.pas' {AllForm};procedure ShowAllQuery();stdcall;
    var f:TAllForm;
    begin
      f:=TAllForm.Create(nil);
      try
        f.ShowModal;
      finally
        f.Free;
      end;
    end;{$R *.res}exports
      ShowAllQuery;
      
    beginend.
    unit单元文件:
    .......
    procedure TAllForm.BitBtn5Click(Sender: TObject);
    var 
      ExpClass : TDBGridEhExportClass;
      Ext, s :String;
    begin
      s := Label1.Caption;
      SaveDialog1.FileName := s + '.xls';  if SaveDialog1.Execute then
      begin
        DBGrid.Selection.SelectAll;
        AllForm.ActiveControl := DBGrid;
        case SaveDialog1.FilterIndex of
          1: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
          2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
          3: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
        else
          ExpClass := nil; Ext := '';
        end;
        if ExpClass <> nil then
        begin
          if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <> UpperCase(Ext) then
            SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
          SaveDBGridEhToExportFile(ExpClass,DBG,SaveDialog1.FileName, true);
        end;
      end;
    end;
    ...........以上为dll.下面是调用dll的部分代码procedure TmainForm.Botton1(Sender: TObject);
    type
      mypointer = procedure();stdcall;
    var
      Handle : THandle;
      frm_p : mypointer;
      begin
        Handle := loadlibrary('AllQuy.dll');
        if Handle > 32 then
        begin
          frm_p := GetProcAddress(Handle, 'ShowAllQuery');
          if @frm_p <> nil then
            frm_p;
        end;
      Freelibrary(Handle);
    end;