DLL开发中遇到疑问,请大神们赐教

没有昵称哦 2019-01-19 10:45:29
我想在DLL中实现一个功能,封装一个TCP向服务端发送数据的功能,我只想导出一个procedure SendMeg(Msg:pchar);的函数
在DLL中实现 TCP的初始化,连接,心跳等功能,

我现在完成的代码中,在DLL中定义了一个类,来实现上面的功能,发现每次调用 SendMsg的时候 就会创建一次这个类实例,来完成发送功能,我要怎么操作,只需要实例化一次这个类,??

引用


type
TTCPDLL = class()
private
Fhost: string;
Fport: Integer;
Finterval: Integer;
Flog: TsfLog;
FTimer: TTimer;
FTCP: TIdTCPClient;
FNvrstate: Boolean;
private
function ConnectTCPrserver(): Boolean;//连接到服务器

procedure CheckOnling();//定时发送心跳包

public
constructor Create();//创建时完成TCP连接和读取连接参数
destructor Destroy; override;
procedure SendMsg(Msg: pchar);//发送数据包

end;



...全文
290 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2019-01-21
  • 打赏
  • 举报
回复
我不知道怎么设计 这个导出函数,不用在调用 SendMsg的时候再去创建 这个实例[/quote]


就是不要在类中写SendMsg,把它放到类的外面,写成一个普通的公用函数
当检测到类没有创建的时候就创建一次,放在一个公用的变量里就行了

为什么这样做?
函数放在类里面,你每次都得先把类创建一次,才能调用类里面的函数、属性、变量
你把它做成公用函数,就不用先创建类,而是动态检测类是否已经创建,动态的去调用类的方法
没有昵称哦 2019-01-20
  • 打赏
  • 举报
回复
引用 1 楼 doloopcn 的回复:
type TTCPDLL = class() private Fhost: string; Fport: Integer; Finterval: Integer; Flog: TsfLog; FTimer: TTimer; FTCP: TIdTCPClient; FNvrstate: Boolean; private function ConnectTCPrserver(): Boolean;//连接到服务器 procedure CheckOnling();//定时发送心跳包 public constructor Create();//创建时完成TCP连接和读取连接参数 destructor Destroy; override; end; var tcpdll:TTCPDLL procedure SendMsg(Msg: pchar);//发送数据包 .... procedure SendMsg(Msg: pchar);//发送数据包 begin if not Assigned(TCPDLL) then TCPDLL:=TTCPDLL.Create; //Send MESSAGE code end;
我不知道怎么设计 这个导出函数,不用在调用 SendMsg的时候再去创建 这个实例
看那山瞧那水 2019-01-20
  • 打赏
  • 举报
回复
单实例模式。 过去(D7)单实例经常这样做: unit Unit2; interface type TOneObject = class public constructor Create; destructor Destroy; override; end; function AOneObject: TOneObject; implementation { TOneObject } var FOneObject: TOneObject; constructor TOneObject.Create; begin end; destructor TOneObject.Destroy; begin inherited; end; function AOneObject: TOneObject; begin if not Assigned(FOneObject) then FOneObject := TOneObject.Create; Result := FOneObject; end; end. ====================================================== 现在(XE+): unit Unit3; interface type TTwoObject = class private class var FDefaultTwoObject: TTwoObject; class function GetDefaultTwoObject(const Value: TTwoObject): TTwoObject; static; public constructor Create; destructor Destroy; override; class property DefaultTwoObject: TTwoObject read GetDefaultTwoObject; end; implementation { TTwoObject } constructor TTwoObject.Create; begin end; destructor TTwoObject.Destroy; begin inherited; end; class function TTwoObject.GetDefaultTwoObject(const Value: TTwoObject): TTwoObject; begin if not Assigned(FDefaultTwoObject) then FDefaultTwoObject := TTwoObject.Create; Result := FDefaultTwoObject; end; end.
薛定谔之死猫 2019-01-20
  • 打赏
  • 举报
回复
DLL在每个进程中有独立的程序和数据空间,你的只创建一次也仅限于进程,在DLL初次载入进程时触发初始化对象的代码,把对象句柄保存在DLL的全局变量中,之后的调用都通过预先保存的句柄直接使用,DLL_PROCESS_ATTACH了解一下,相信你看了就明白
BlueStorm 2019-01-19
  • 打赏
  • 举报
回复
从道理上讲,SendMsg本身需要创建实例才能调用,为什么反而是调用SendMsg会创建实例?
doloopcn 2019-01-19
  • 打赏
  • 举报
回复
type
TTCPDLL = class()
private
Fhost: string;
Fport: Integer;
Finterval: Integer;
Flog: TsfLog;
FTimer: TTimer;
FTCP: TIdTCPClient;
FNvrstate: Boolean;
private
function ConnectTCPrserver(): Boolean;//连接到服务器

procedure CheckOnling();//定时发送心跳包

public
constructor Create();//创建时完成TCP连接和读取连接参数
destructor Destroy; override;

end;
var
tcpdll:TTCPDLL
procedure SendMsg(Msg: pchar);//发送数据包
....
procedure SendMsg(Msg: pchar);//发送数据包
begin
if not Assigned(TCPDLL) then
TCPDLL:=TTCPDLL.Create;
//Send MESSAGE code
end;

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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