dll里的数据集组件共享的exe的数据连接,现在是第一次运行都很正常,但关闭后再打开查询,就各种问题了。----------------------------------------------------
调用dll打开dllform
procedure TMainFrm.N11Click(Sender: TObject);
begin
  uPublicMethod.OpenDllFrm('BatchWageRecord.dll', '');
end;function OpenDllFrm(DllName, Str: string): string;
var
  DllHandle: THandle;
  ShowFrm: TShowFrm;
begin
  Result := '';
  DllHandle := LoadLibrary(PAnsiChar(DllName));
  if DllHandle <> 0 then
  begin
    @ShowFrm := GetProcAddress(DllHandle, 'ShowFrm');
    if @ShowFrm <> nil then
      ShowFrm(Application.Handle, DataModule1.conDB, Str)
    else
    begin
      WriteWorkLog('加载 ' + DllName + ' 函数ShowFrm失败。', Dosp_GetSysTime);
      Result := '打开窗体失败!';
    end;
  end
  else
  begin
    WriteWorkLog('未找到' + DllName + ' ,加载失败。', Dosp_GetSysTime);
    Result := '加载 ' + DllName + ' 失败!';
  end;
end;dll里的方法:procedure ShowFrm(AHandle: THandle; Con: TADOConnection; Str: string); stdcall;
  procedure GetUserInfo;
  var
    CharPos: Integer;
  begin
    CharPos := Pos('#', str);
    UserID := Copy(Str, 1, CharPos - 1);
    UserPassword := Copy(Str, CharPos + 1, Length(str) - CharPos);
  end;
var
  PerQueryFrm: TPerQueryFrm;
begin
  Application.Handle := AHandle;
  PerQueryFrm := TPerQueryFrm.Create(nil);
  DataModule2 := TDataModule2.Create(nil);
  GetUserInfo;
  DataModule2.qry_DynamicQuery.Connection := Con;
  DataModule2.sp_GetSysTime.Connection := Con;
  DataModule2.qry_GetSalary.Connection := Con;
  DataModule2.sp_GetWageHistory.Connection := Con;
  PerQueryFrm.ShowModal;
end;------------------------------------------------
关闭dllformprocedure TPerQueryFrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DataModule2.qry_DynamicQuery.Close;
  DataModule2.sp_GetSysTime.Close;
  DataModule2.qry_GetSalary.Close;
  DataModule2.sp_GetWageHistory.Close;
  DataModule2.qry_DynamicQuery.Connection := nil;
  DataModule2.sp_GetSysTime.Connection := nil;
  DataModule2.qry_GetSalary.Connection := nil;
  DataModule2.sp_GetWageHistory.Connection := nil;
end;

解决方案 »

  1.   

    不用的时候就Free掉,比如PerQueryFrm.Free
    或者只创建一次,后面调用时就直接显示,就不用再创建了,用AsSigned()判断
      

  2.   

    procedure TPerQueryFrm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      DataModule2.qry_DynamicQuery.Close;
      DataModule2.sp_GetSysTime.Close;
      DataModule2.qry_GetSalary.Close;
      DataModule2.sp_GetWageHistory.Close;
      DataModule2.qry_DynamicQuery.Connection := nil;
      DataModule2.sp_GetSysTime.Connection := nil;
      DataModule2.qry_GetSalary.Connection := nil;
      DataModule2.sp_GetWageHistory.Connection := nil;
      Action := caFree;end;
    加一行
      Action := caFree;试一下
      

  3.   

    这个一般对ShowModal的窗体有些效果,但非Modal的话,比如你把DLL中的窗体以show方式嵌入到调用主机程序的某个控件,如tabsheet或panel上的话,就有可能要复杂不少,我是用的发消息通知的方式来使主机和dll协调工作的,可能想的太复杂了