各位前辈请帮忙:
DLL关键内容:
procedure ReceiveText(Sender: TObject;Socket: TCustomWinSocket);
var a:pchar;
begin
  a:=pchar(clientsocket1.Socket.ReceiveText);
end;procedure connect(x,y:pchar); stdcall;
begin
  ClientSocket1:=TClientSocket.Create(nil);
  ClientSocket1.Active:=false;
  ClientSocket1.Address:=string(x);
  ClientSocket1.ClientType:=ctNonBlocking;
  ClientSocket1.Port:=strtoint(y);
  ClientSocket1.Active:=true;  TMethod(MyReadEvent).Code := @ReceiveText;
  TMethod(MyReadEvent).Data := ClientSocket1;
  ClientSocket1.OnRead:=MyReadEvent;//在收到消息后调用ReceiveText过程,但是我不懂的立刻输出消息内容
end;问题是我要在接收到消息时候立刻输出接收的内容
如果不用DLL那很容易,只要:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.Lines.Add(接收的消息);
end;
就可以
可是用DLL小弟就不懂了
因为必须是要在dll中只要接收到消息(这个我可以实现,但是除了用showmessage外我实在是想不出别的办法立刻输出消息内容)就立刻输出消息内容,
请各位大哥帮帮忙,小弟感激不尽!!!能解决了立刻给分!欢迎讨论,谢绝灌水!

解决方案 »

  1.   

    象你这么写就可以呀。
    ClientSocket1.OnRead:=MyReadEvent;在MyReadEvent里接收的到内容写进一个log日志中就可以了。我可能还是没有完全理解你的意思?
      

  2.   

    谢谢你呀这么赏脸,我看看行不行,我的要求就是能把dll里面接收到的消息立刻传到外边窗体,再立刻在memo或label上显示出来,或者立刻在memo上显示出来!
      

  3.   

    使用回调函数吧在你的宿主exe中,声明一个函数,这个函数实现下面这个功能
    memo1.Lines.Add(接收的消息);然后将这个函数的函数地址,传递给dll,
    在dll中接收到消息后,就调用这个函数
      

  4.   

    具体的技术点,楼上可以查一下Hubdog的葵花宝典,或者Kingron 的超级猛料,
      

  5.   

    各位大哥最好给出代码!只要封装在DLL中的tclientsocket能在接收到tserversocket发的消息后立刻自动把消息传出dll显示在窗体的Tmemo上就可以,方法不限。小弟的分不是很多,还望各位大哥不要计较,大家都有共同的爱好,小弟很乐意和大家做朋友!谢谢!
      

  6.   

    OK,我写了一个demo1.主程序Project_dll.dpr
    一个窗口,一个memo,一个button
    ==================
    (1)dfm文件object Form1: TForm1
      Left = 194
      Top = 174
      Width = 517
      Height = 184
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Memo1: TMemo
        Left = 16
        Top = 16
        Width = 481
        Height = 89
        Lines.Strings = (
          'Memo1')
        TabOrder = 0
      end
      object Button1: TButton
        Left = 328
        Top = 112
        Width = 171
        Height = 25
        Caption = 'run dll funtions'
        TabOrder = 1
        OnClick = Button1Click
      end
    end(2)pas文件
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  //定义函数类型
      P_FormFun = Function (log : String) : Integer;  //定义Dll输出的函数类型
      Function fun_Test ( pfun:P_FormFun) : integer ; stdcall ;External 'Project_dll.dll';
    var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }//这个函数是一个过程函数,不是窗口类的成员
    function fun_addlog(log: string): integer;
    begin
      Form1.Memo1.Lines.Add(log);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      pfun :P_FormFun;
    begin
      pfun := @fun_addlog;
      //将这个函数的指针传递给dll,就可以在dll中调用外面的函数
      fun_Test(pfun);
    end;end.2.dll工程Project_dll.dpr
    ==================
    library Project_dll;
    uses
      SysUtils,
      Classes;
    type
      //定义函数类型
      P_FormFun = Function (log : String) : Integer;{$R *.res}Function fun_Test ( pfun:P_FormFun) : integer ; stdcall ;
    var
      s:string;
    begin
      s := '这是dll中向外面Form发送的消息';
      pfun(s);  Result := 0;
    end ;exports
       fun_Test;begin
    end.
      

  7.   

    上面写错了一个工程名,修改一下1.主程序Project.dpr
      

  8.   

    do2008:这位大哥,先感谢你这么支持我,但是不知道是我太笨还是你还没有完全理解我的意思,我是要封装在DLL里面的TClientsocket类在收到TServersocket方发出的消息后就立刻自动显示在外边exe窗口的memo中,而不需要去触发Tbutton才显示。你先看看我上面的那段程序。但是怎么说也太感谢你了,我算分的时候你照样占一份的!
      

  9.   

    你说的要求我明白,肯定不能是点击按钮才显示的消息的
    我上面的代码呢,只是作一个例子,说明如何使用回调函数的方法;你现在需要做的呢,可以参考一下我的代码,修改出你的要求的程序来1.我的代码是在点击按钮的时候,才调用dll中的函数;而你的代码需要在程序初化的时候调用,比如FormCreate事件2.我写的那个dll的函数,马上就调用了exe外面的显示消息的函数,
    ...
    s := '这是dll中向外面Form发送的消息';
    pfun(s);
    ...你是现在要改成不调用,而是在dll中声明一个全局的函数指针,保存着这个回调函数的指针
    例如:
    library Project_dll;
    uses
    SysUtils,
    Classes;
    type
    //定义函数类型
    P_FormFun = Function (log : String) : Integer;var
     g_pfun:P_FormFun;
    {$R *.res}Function fun_Test ( pfun:P_FormFun) : integer ; stdcall ;
    begin
      g_pfun := pfun ;//保存指针
      Result := 0;
    end ;function fun_XXX()//TClientsocket类在收到TServersocket方发出的消息
    var
     a_msg:string;
    begin
       //这个是你的接收函数   ...
       g_pfun(a_msg);这样就显示你接收到的消息
       ...end;exports
    fun_Test;begin
    end.
      

  10.   

    总之呢,上面的思路就是,在dll中定义
    var
    g_pfun:P_FormFun;这个全局的函数指针,然后在你的dll中,任何的任一函数,都可以调用到这个外面的exe的函数
    就达到了你的目的。写程序的时候,需要灵活处理各种情况,呵呵