各位前辈请帮忙:
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外我实在是想不出别的办法立刻输出消息内容)就立刻输出消息内容,
请各位大哥帮帮忙,小弟感激不尽!!!能解决了立刻给分!欢迎讨论,谢绝灌水!
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外我实在是想不出别的办法立刻输出消息内容)就立刻输出消息内容,
请各位大哥帮帮忙,小弟感激不尽!!!能解决了立刻给分!欢迎讨论,谢绝灌水!
解决方案 »
- FastReport 报表的RichView处理中文的BUG,请各位帮帮忙!
- 求一份delphi2009的TBalloonHint,可是只在Controls.pas里
- LISVIEW的问题还是代码有问题?
- 使用过 Virtual Treeview 控件的高手,请进!!! 在线等待给分!
- 散分!~
- 关于dbExpress面板里的SQLConnection和SimpleDataSet的事务处理
- memo的内容需要通过什么方式能存到数据库的memo里?
- 用QuickReport,如何每页做一个合计?
- 关于加入声音的问题!
- 高分悬赏100!怎样列出WINDOWS系统内存中在使用的所有.DLL名?怎么从中卸掉一个.DLL?
- 我启动另一个进程时对标准输入输出进行了重定向,结果运行时卡巴斯基弹出一个框来拦截,说可能是病毒
- 用ado可否修改返回的数据?
ClientSocket1.OnRead:=MyReadEvent;在MyReadEvent里接收的到内容写进一个log日志中就可以了。我可能还是没有完全理解你的意思?
memo1.Lines.Add(接收的消息);然后将这个函数的函数地址,传递给dll,
在dll中接收到消息后,就调用这个函数
一个窗口,一个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.
我上面的代码呢,只是作一个例子,说明如何使用回调函数的方法;你现在需要做的呢,可以参考一下我的代码,修改出你的要求的程序来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.
var
g_pfun:P_FormFun;这个全局的函数指针,然后在你的dll中,任何的任一函数,都可以调用到这个外面的exe的函数
就达到了你的目的。写程序的时候,需要灵活处理各种情况,呵呵