编写DLL时出一点问题,帮忙看看..

xiaoyuehen 2003-06-17 04:47:15
我想让软件各部份的功能分别做成DLL,客户端调用DLL实现操作数据库的功能...

现在出了一点问题,我在客户端直接用socketconnect连到服务器端,在运行时用按钮刷新数据库在客户端的显示效果,很正常..

但是通过客户端调用其他部份(已做成dll,在客户端载入时,类似插件加载)时..例如:客户端通过一按钮点击后,加载dll,出现合同管理窗口.想在这个窗口中实现合同的添加,删除,管理功能..界面与客户端类似,所以也加了socketconnect,clientdataset,datasource,dategrid等组件来连接服务器端,在测试阶段(未运行),设置好各项参数,dategrid可以正常显示数据...但是我在运行时用一个按钮来实现刷新时却出现了问题...

Access violation at address 0123BC4E in module 'dpr_ht.dll'.Read of address 00000058

这是什么意思啊??是不是表明封装的dll不可以向服务器端发送请求?
...全文
17 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyuehen 2003-06-23
  • 打赏
  • 举报
回复
谢谢楼上的回答,这就给分...

问题还是没有解决,你说的意思我不太懂:(
我在Showfrm_main接口函数中加入
try
//给窗体标题赋值
//frmht_main.Caption := '合同信息管理';//ACaption;
//模式显示窗体
frmmain.ShowModal;
DM.Create(nil);
finally
frmmain.Free;
FreeAndNIl(DM);
end;
也还是不行(当然前面已有定义变量DM为TDM)...

真想不出问题是出在哪里:(
李_军 2003-06-20
  • 打赏
  • 举报
回复
加分,我给你发个例子好了
你在导出函数中
创建一个DataModule
DM:= TDataModule.Create(Nil);
然后就可以用了
该DM你可以一开始放好,将Query放在里面
最后退出的时候释放掉
FreeAndNIl(DM);
shareach 2003-06-19
  • 打赏
  • 举报
回复
我碰到过:
1、一种解决方法是:不要静态调用;
2、不要传入Handle,handle在动态库中用Api查找的方式得到
xiaoyuehen 2003-06-19
  • 打赏
  • 举报
回复
帮帮忙呀...分不够可以再加的...:)
xiaoyuehen 2003-06-19
  • 打赏
  • 举报
回复
回楼上...
1.不要静态调用?我用的dll是在运行时动态载入的呀..还是我的理解有误?
2.我要的效果是这样的:当主程序开始运行时,只是加载插件的一些基本信息,比如插件的ID号等,以此来判别用户的操作权限.当运行插件时,再载入插件窗口的各项信息,包括连接服务器端数据库的DataModule,以及其他的配置信息..现在遇到的问题是,当运行插件主窗口时,DataModule并没有同时被加载(创建),导致插件主窗口的DBGrid无法显示数据集,所以我想请教怎么在加载插件窗口(内有一SocketConnection连接服务器端)的同时,载入DataModule,并通过SocketConnect连接到服务器端(亦即中间层)的数据集...代码应该怎么写呢?
李_军 2003-06-18
  • 打赏
  • 举报
回复
对的,那就是你的clientdataset没有创建,你的clientdataset放在什么里面,如果是放在DataModule中,那就是可能你的DataModule没有创建,你用之前先创建他
xiaoyuehen 2003-06-18
  • 打赏
  • 举报
回复
回楼上..我调用dll时,为了连接数据库..需要设置clientdataset的active为真,这样dbgrid才能正确显示数据...但在设置clientdataset时就是出错了,像你所说的,可能是这个组件这时还没有创建....那我怎么在设置值时,先创建这个组件呢?
xiaoyuehen 2003-06-18
  • 打赏
  • 举报
回复
顶一下,帮帮忙...
xiaoyuehen 2003-06-18
  • 打赏
  • 举报
回复
若以上步骤能实现,在下面的语句中,我就能调用DM中的一个clientdataset的Active属性值,设置为True,窗口中的DBGrid就能显示数据库的内容了..
procedure TfrmHT_Main.SpeedButton1Click(Sender: TObject);
begin
DM.CDS_TEST.Active :=True;
end;
xiaoyuehen 2003-06-18
  • 打赏
  • 举报
回复
感谢楼上的回答...事实证明你的观点是正确的,确实是因为对象未创建..我把clientdataset放在窗体(调用dll时显示的窗体)中,可以实现..但这并不是我想要的结果...

dll的编写中,我定义了一个接口函数function Showfrm_main(AHandle: THandle): Boolean;,使得主程序在调用dll时,显示插件的窗口..具体内容如下:
function Showfrm_main(AHandle: THandle): Boolean;
var
frmmain: TfrmHT_Main;
begin
result := true;
try
//传递应用程序地址
application.Handle := AHandle;
//创建窗体
frmmain := TfrmHT_Main.Create(Application);
TDM.Create(Application);////////////////我想在窗口创建的同时,创建这个数据池(刚学Delphi,不知道这个说法行不行)...应该怎么写呢?
try
//给窗体标题赋值
//frmht_main.Caption := '合同信息管理';//ACaption;
//模式显示窗体
frmmain.ShowModal;
finally
frmmain.Free;
end;
except
result := false;
end;
end;

我想在这个函数当中加入创建DM(一个Data Module,所有与服务器端连接的clientdataset都在此,便于插件的主窗口调用),那我应该怎么写这语句?(因为刚开始学Delphi,一些基本信息还未明了,若能顺便把代码写出来,万分感谢)

麻烦你了!
李_军 2003-06-17
  • 打赏
  • 举报
回复
你调试一下,到什么地方,出错的,就是那里有问题
xiaoyuehen 2003-06-17
  • 打赏
  • 举报
回复
那我怎么确定每个对象是不是已经创建了吗?
李_军 2003-06-17
  • 打赏
  • 举报
回复
地址错误,说明有那个对象没有创建的时候,你就已经使用了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧