帮忙看一下这个3层程序(100分)

G

gdxkz

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端:
AdoConnection,AdoQuery,DataPrivate
客户端:
SocketConnection, ClientDataset
我要把每个模块做成独立的DLL,在主程序中连接上服务器,并设置好ClientDataSet,
模块DLL采用动态载入的方式,
当调用模块时,把ClientDataset当做参数传给DLL,接口函数
function UserLogin(AHandle:THandle;ACaption:string;ClientDataSet:TClientDataSet):WideString;export;
这样打开数据,检测数据,关闭Dll都没有问题,但EXE文件关闭时就出错。
在DLL中有执行CoInitialize(nil),为什么退出EXE会出错?
上面的方式只要主程序连一次服务器,是否要改为在没个模块DLL中做连接服务器的动作?
 
为什么要搞得这么复杂,用远程数据模块不好吗?
 
关注一下。
你的DLL是用在客户端程序,还是服务端的程序?
 
你的第一个问题我作过,没有记得有问题
第二个问题你只要在主程序上连接服务器就可以了哦!
 
加上stdcall看看。
 
re 白衣书生,
我的dll用在客户端。
re sanlanggugu,
我就是在主程序连接到服务器的,如果不关闭程序就没有任何问题,一但主程序关闭就出错。
是不是不能ClientDataSet:TClientDataSet这样传参数进DLL?
 
可以 ClientDataSet:TClientDataSet 这样传的
 
是因为你没有把Dll释放掉,你必须把它free掉。
 
下面是调用DLL的代码
procedure TForm1.Button2Click(Sender: TObject);
type
func=function (AHandle:tHandle;ACaption:string;ClientDataSet:TClientDataSet):WideString;
var
x:WideString;
aLib:tHandle;
proc:func;
begin
aLib:=LoadLibrary('loginproject.dll');
if aLib>=32 then
begin
@proc:=GetProcAddress(aLib,'UserLogin');
x:=proc(application.Handle,'用户登陆',ClientDataSet1);
FreeLibrary(aLib);
//已经释放掉了<------------
end;
edit1.text:=x;
end;
 
用静态调用试试
 

出错的原因我估计是DLL中用了ClientDataset后导致主程序的内存地址混乱。
出错信息:access violation at 0x77e77502:write of address 0x00030ffc
晕了~~~~
 
多人接受答案了。
 
顶部