作分布式应用时,我想把与网上服务器连接,会话的过程及函数用DLL来表示,于是
新建一个Data Module里面放入 SocketConnection 和 ClientDataSet1.  为了使调用时可以使SocketConnection.connected:=true;  我用了一个过程 
procedure SetConnected;
begin
  dm.conn.Connected:=true;
end;调用时:
 type
   Tsetconnected=procedure ; stdcall;   
   .
   .
procedure TForm1.Button1Click(Sender: TObject);
var setconnected:Tsetconnected;
    libHandle:Thandle;
begin
    libHandle:=loadlibrary('conndata.dll');
    @setconnected:=getProcAddress(libHandle,'SetConnected');
    setconnected;
end;
但无论在静态调用和动态高用时都会出错:Access violation at address 00000000,Read of address 0000000'请问是什么原因,是datamodule不能放入DLL 还是我的调用有问题,谢谢!

解决方案 »

  1.   

    你有没有初始化dm啊?我认为八成是你没有初始化dm。
    因为应用程序在dpr文件中都有
    Application.CreateForm(TDm, dm);这样得代码,而dll中不会有。
      

  2.   

    exports
     SetConnected;begin
    Application.CreateForm(TDm, dm);
    end.
    我初始化了还是出现上面的错误提示?
      

  3.   

    dll会执行begin和end之间的代码吗?
    procedure SetConnected;
    begin
      dm:=Tdm.Create(Application);
      dm.conn.Connected:=true;
    end;
      

  4.   

    当你将ClientDataSet1.active:=true时SocketConnection.connected会自动设为true;当你用到线程时,记得先没置SocketConnection.connected的初始状态。如在用到线程时SocketConnection.connected的状态是true你要将其调为false 要SocketConnection.connected=true;SocketConnection.connected=false;并且用到线程时最好在线程里面动态创建一个SocketConnection。
      

  5.   

    DLL里面
    function SetConnected(Ahandle:Thandle; ACaption: String):longint;
    begin
      Application.Handle:=Ahandle;
      DM:=TDM.Create(application);
      Result := Longint(DM);
     // dm.Name:=ACaption;
     // dm.conn.Connected:=true;
    end;调用时
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    libHandle:=loadlibrary('getdata.dll');
    @setconnected:=getProcAddress(libHandle,'setconnected');
    setconnected(application.Handle,'jjj');调用时还是出现相同的错误信息,用这种方法调用form,使之显示是可以的。
    请问问题出在哪里?先谢了!
      

  6.   

    我已经解决了
    function SetConnected(Ahandle:Thandle):longint;
    begin
      Application.Handle:=Ahandle;
      DM:=TDM.Create(application);
    end;