不能向Dll中传递Session吗??(50分)

  • 主题发起人 主题发起人 HuangSkar
  • 开始时间 开始时间
H

HuangSkar

Unregistered / Unconfirmed
GUEST, unregistred user!
我需要在dll中使用主程序中的Database组件来连接数据库,
主程序的编译环境为不选中complie with run time package,
我通过传递Sessions的方式来调用dll,第一次调用的时候没有
问题,但是第二次调用的时候,程序就会出错,不知是什麽原因
????Dll中不能使用Session吗?该如何使用??
哪位大虾肯指点迷津。
Dll中的调用程序如下:
==========
procedure ShowDataImportForm(AHandle:THandle;Base:TDataBase;UserName:PChar;MySessions:TSessionlist);
var
DllSession:TSession;
begin
Try
Application.Handle:=AHandle;
if Sessions<>MySessions then
begin
Sessions:=MySessions;
end;
DllSession:=Sessions.OpenSession('Default');
CustomerData:=TCustomerData.create(Application);
with CustomerData do
begin
Table1.close;
Table1.Sessionname:=DllSession.Sessionname;
Table1.DatabaseName:=base.databasename;
Table1.TableName:=Username;
Table1.Open;
end;
MainForm:=TMainForm.Create(Application);
MainForm.showmodal;
finally
MainForm.free;
CustomerData.table1.close;
CustomerData.Free;
DllSession:=nil;
end;
end;
 
难道无人相帮????
伤心呀。。。
 
既然无人回答问题,我想收回此问题。
不知如何收回?
我对大富翁太失望了!!!
 
你可以将Sessions有属性autosessionsname设为true,试试看,说不定可以解决该问题的![8D][:D]
 
function OpenForm(AHandle: THandle; ACaption: String;ADataBase:Longint):longint;
var
FrmMain: TFrmMain;
begin
Application.Handle := AHandle;
FrmMain := TFrmMain.Create(Application);
FrmMain.FClose:=false;
frmmain.mydatabase:=TDatabase(adatabase);
frmmain.Table.DatabaseName:=frmmain.MyDataBase.DatabaseName;
frmmain.Table.Active:=true;
Result := Longint(FrmMain);
FrmMain.Caption := ACaption;
FrmMain.Show;
end;
 
代码:
先调用procedure AssignSession(Session: TSession); cdecl;传入一个Session
在调用ShowForm显示窗体。还可以显示多个窗体
释放的时候全部关掉
前面写的是原先写的一个测试部分
这个是后来的写好的,会更好点。我没来的及测试。
因为我那时候写的是传 ODAC的TOraSession,不是TSession
有问题我在帮你测试,别对大富翁这么没信心,我在这里找到了好多问题的答案


unit DLLMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBTables;

type
  TfmDllMain = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

procedure AssignSession(Session: TSession); cdecl;
procedure ShowForm; cdecl;
procedure HideForms; cdecl;

implementation

{$R *.DFM}

var
  ExternalSession: TSession;
  FormList: TList;
  FormCount: integer;

procedure AssignSession(Session: TSession); cdecl;
begin
  ExternalSession:= Session;
end;

procedure ShowForm; cdecl;
begin
  InitOCI; 
  with TfmDllMain.Create(Application) do begin
    Inc(FormCount);
    Query.Session := ExternalSession;
    //OraQuery.Active := True;
    Show;
  end;
end;

procedure HideForms; cdecl;
begin
  while FormList.Count > 0 do begin
    TForm(FormList[0]).Free;
    FormList.Delete(0);
  end;
end;

procedure TfmDllMain.FormShow(Sender: TObject);
begin
  FormList.Add(Self);
end;

procedure TfmDllMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FormList.Remove(Self);
  Action := caFree;
end;

initialization
  FormCount:= 0;
  FormList:= TList.Create;
finalization
  HideForms;
  FormList.Free;
end.
 
多人接受答案了。
 
不接受,问题没有解决。
 
后退
顶部