当前位置:主页>销售管理软件> 列表

C/S客户端做成DLL的问题 找qq软件管理

记账软件版1楼: 我的目的就是:程序运行时可以不必全部载入内存,只在打开指定窗体时,将该窗体载入内存。在切换窗体时,释放上一个打开的窗体占用的内存。
考虑应该用DLL,但具体不知如何实现,或者有其它方法,请指教

2楼: 主程序做成PROGRAM 其他都由主程序调用DLL实现就行了,
记得在主程序的END节中释放DLL资源 如qq软件管理

3楼: 多谢楼上老兄的回答
大家在做程序的时候这样做吗?
能否给出个具体的例子
即:
1、主程序的调用
2、某窗体的定义
另外,在编译或其他方面应该注意什么呢?

4楼: Dll之间是无法传递类的,只能传递简单的数据类型,所以你很难把数据连接传递过去。我以前作的类似的程序是做一个本地的RemoteDataModule中间层,然后所有的Dll通过中间层进行数据处理。
如果不希望采取这种方式的话,建议你使用BPL吧。这个是可以传送类的。你可以吧ADOConnection或其它的数据连接传送过去。

5楼: 硕鼠兄你好
在下用的是数据模块共享ADO数据库连接,如你所说,DLL确实无能为力了吗?
那用BPL应该怎么做呢?能实现我说的分部分调入内存呢?
多谢指导。

6楼: BPL也可以动态加载。你可以上网找一下动态加载BPL的方法试一下。比Dll复杂,但是功能强得多。网上有很多这方面的例子。

记账软件版7楼: 让你的窗体都动态creat不就行了。。。不用的时候close再free 显示的时候先creat

8楼: 在Application里面释放Dll中创建的类会出错误的。通常都是在Dll中释放Dll创建的类。
Dll中的类通常也只能在Dll中创建的,然后通过接口传送到Application中使用。类是无法从Dll传送到Application的,反向也不行。

9楼: 我好像就把ado的connect连接传到dll中使用了,应该没有问题

unit PlugStandardUnit;

interface
uses Forms,
Classes,
Windows,
ADODB,
PubUnit,
SysUtils ;

type TFormClass = class Of TForm;

var
_rdParam: _RdGlobalParam;
_AdoCon : TADOConnection;

var
DllApplication: TApplication;


//带数据库支持的插件模块的导出
procedure PlugModuleEx(ParentApplication: TApplication; ParentForm: TForm;
var rdParam: _RdGlobalParam; pAdoCon: TADOConnection); stdcall;

//工程初始化
procedure DLLUnloadProc(Reason: Integer); register;
//---- 打开 MDI 子窗口
// 调用例子 OpenMDIChild(TComponentClass(TfrmRoleset), TForm(frmRoleset));
procedure OpenMDIChild(TfrmMDIChild: TFormClass; ParentForm: TForm; frmMDIChild: TForm);

implementation

uses MainFrm;




procedure PlugModuleEx(ParentApplication: TApplication; ParentForm: TForm;
var rdParam: _RdGlobalParam; pAdoCon: TADOConnection); export; stdcall;
begin
Application := ParentApplication;
_AdoCon := pAdoCon;
_rdParam := rdParam;
OpenMDIChild(TfrmMain, ParentForm, frmMain);
end;

procedure OpenMDIChild(TfrmMDIChild: TFormClass; ParentForm: TForm; frmMDIChild: TForm);
var
iLoop: integer;
begin
for iLoop := Application.MainForm.MDIChildCount - 1 downto 0 do
if Application.MainForm.MDIChildren[iLoop] is TfrmMDIChild then
begin
ShowWindow(Application.MainForm.MDIChildren[iLoop].Handle, SW_RESTORE);
Application.MainForm.MDIChildren[iLoop].Position := poMainFormCenter;
Exit;
end;
frmMDIChild := TfrmMDIChild.Create(ParentForm);
frmMDIChild.Show;
end;

procedure DLLUnloadProc(Reason: Integer); register;
begin
if Reason = DLL_PROCESS_DETACH then
Application := DllApplication;
end;


end.