我想让软件各部份的功能分别做成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不可以向服务器端发送请求?

解决方案 »

  1.   

    回楼上..我调用dll时,为了连接数据库..需要设置clientdataset的active为真,这样dbgrid才能正确显示数据...但在设置clientdataset时就是出错了,像你所说的,可能是这个组件这时还没有创建....那我怎么在设置值时,先创建这个组件呢?
      

  2.   

    对的,那就是你的clientdataset没有创建,你的clientdataset放在什么里面,如果是放在DataModule中,那就是可能你的DataModule没有创建,你用之前先创建他
      

  3.   

    感谢楼上的回答...事实证明你的观点是正确的,确实是因为对象未创建..我把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,一些基本信息还未明了,若能顺便把代码写出来,万分感谢)麻烦你了!
      

  4.   

    若以上步骤能实现,在下面的语句中,我就能调用DM中的一个clientdataset的Active属性值,设置为True,窗口中的DBGrid就能显示数据库的内容了..
    procedure TfrmHT_Main.SpeedButton1Click(Sender: TObject);
    begin
      DM.CDS_TEST.Active :=True;
    end;
      

  5.   

    我碰到过:
    1、一种解决方法是:不要静态调用;
    2、不要传入Handle,handle在动态库中用Api查找的方式得到
      

  6.   

    回楼上...
    1.不要静态调用?我用的dll是在运行时动态载入的呀..还是我的理解有误?
    2.我要的效果是这样的:当主程序开始运行时,只是加载插件的一些基本信息,比如插件的ID号等,以此来判别用户的操作权限.当运行插件时,再载入插件窗口的各项信息,包括连接服务器端数据库的DataModule,以及其他的配置信息..现在遇到的问题是,当运行插件主窗口时,DataModule并没有同时被加载(创建),导致插件主窗口的DBGrid无法显示数据集,所以我想请教怎么在加载插件窗口(内有一SocketConnection连接服务器端)的同时,载入DataModule,并通过SocketConnect连接到服务器端(亦即中间层)的数据集...代码应该怎么写呢?
      

  7.   

    加分,我给你发个例子好了
    你在导出函数中
    创建一个DataModule
    DM:= TDataModule.Create(Nil);
    然后就可以用了
    该DM你可以一开始放好,将Query放在里面
    最后退出的时候释放掉
    FreeAndNIl(DM);
      

  8.   

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