怎样调用dll里的窗体,高手进,在线等.......... ( 积分: 50 )

  • 主题发起人 主题发起人 lcmlhs
  • 开始时间 开始时间
L

lcmlhs

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:
dll里有form1窗体和datamodule1数据模块,datamodule1里有ado数据集组件,form1窗体里有ado查询,问题是:当调用dll里的form1时,查询功能不能用了,就是数据模块里的ado出错,请问怎样解决呀???????
 
创建DLL:
1、在application中,把begin..end之间的东西去掉
2、把project改成library
3、在uses和{$R *.RES}后面,begin end前面,加:
procedure CreateDllForm(Parameter:Longint);stdcall;
var
//这里定义要显示的Dll窗体
Form1:TForm1;
begin
Application.Handle:=Parameter;
Form1:=TForm1.Create(Application);
try
Form1.ShowModal;
finally
Form1.Free;
Form1:=nil;
end;
end;

exports CreateDllForm;
然后编译,即完成dll.



应用:
4.implementation后面增加应用说明:
procedure CreateDllForm(Parameter:Longint);stdcall;external 'project1.dll';

5.在buttonclick里面,增加:
CreateDllForm(Application.Handle);






如果要将一个项目全部转化成dll窗体,需要做处理,
首先,选择一个做主窗体,这个主窗体和其他的不产生联系,只是调用其他的(如果有联系,需要声明..麻烦).

其次,把其他的窗体放在一个Project里面,做成library,在project resource中,有几个Form搞几个CreateDllForm函数,

最后,把其他窗体中原来的调用窗体的show方法全部改成现在的调用dll的方法,

完成,相当于其他的所有窗体是一个project,在里面,全局变量啊什么的都有效.
 
是的,我就是想把一个项目转化为dll,这个项目有两个窗体form1(主窗体),form2。
还有一个datamodule数据模块,所有的数据集都在里面。
我怎样把其它的做成library呀?关键是那个数据模块窗体呀,我的QQ:421523593
 
大家帮忙呀
 
分不够再加了
 
有什么错误提示?
 
---------------------------
Project1
---------------------------
Access violation at address 002D4083 in module 'P_tnbjk_dll.dll'. Read of address 0000005C.
---------------------------
确定
---------------------------
 
好像调用时没有连上数据库,数据集adoconn,和Adoquery都在数据模块里面呢,
 
DLL 里面的 datamodule 窗体要手动创建,有手动创建没有?
 
好像要初始化,怎样初始化呀,下面是我的代码:
library P_tnbjk_dll;

uses
windows,
SysUtils,
Classes,
Forms,
ComObj,

Unit1 in 'Unit1.pas' {Form1},
U_DM in 'U_DM.pas' {DM: TDataModule},
U_bjzd in 'U_bjzd.pas' {Frm_bjzd};

{$R *.res}

function ShowForm(aHandle:THandle;acaption:pchar):Boolean;stdcall;
var
form1:tform1;
begin
Application.Handle:=aHandle;
form1:=tform1.Create(Application);
try
form1.ShowModal;
finally
form1.Free;
end;
Result:=true;
end;

exports showform;

begin
end.
 
在创建form1时创建了:
procedure TForm1.FormCreate(Sender: TObject);
begin
dm:=tdm.create(self);
end;
运行时会有:

---------------------------
Project1
---------------------------
尚未调用 CoInitialize。.
---------------------------
确定
---------------------------
 
你的 Unit1 单元里面有没有
DM := TDM.Create(nil);
来创建 DataModule 模块
 
Unit1 单元加入

uses
activex;

initialization
CoInitialize(nil);
finalization
CoUninitialize;
 
.....
var
Form1: TForm1;

implementation

uses U_DM,activex;

initialization
CoInitialize(nil);
finalization
CoUninitialize; 这样吗?



....
 
这样编译不过去呀
 
to liyinwei:在吗??
 
接力,接力。
我觉得是这个样子,仅供参考
你的dll加载的话,当然父进程是你的窗体了,而地址空间应该也和你的父窗体有关,(顺便提一下,因为数据库组件用到了低级驱动,所以没连接上而出错导致不能用的机会好像比较小),可能是这个的原因,解决办法就是在你引用那个窗体的时候,在窗体过程里显示的初始化你的那个窗体的指针和数据库组件的指针以及句柄。。。
试试吧[8D]
 
那个位置应该在最下面,搞 定了,不过不是很理想,大家继续讨论吧
 
后退
顶部