加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 通知从dll到主应用程序的事件

发布时间:2020-12-15 09:41:42 所属栏目:大数据 来源:网络整理
导读:我正在开发打算跨平台的应用程序.我以前使用 Windows消息,但现在我正在删除它.我用回调替换了消息,但无论我是否可以使用不同的技术,我都不知道不使用Windows消息时的不同可能性. 好吧,我有主要的exe应用程序和一些DLL插件.我在dll中有一些对象和线程,我想通
我正在开发打算跨平台的应用程序.我以前使用 Windows消息,但现在我正在删除它.我用回调替换了消息,但无论我是否可以使用不同的技术,我都不知道不使用Windows消息时的不同可能性.

好吧,我有主要的exe应用程序和一些DLL插件.我在dll中有一些对象和线程,我想通知主应用程序有关DLL对数据结构所做的一些更改.

正如我所说,我目前正在处理一些回调.为了提供与不同语言(C,VB,C#)的兼容性,我有非对象类型的回调.我不确定其他语言是否支持对象的回调.

所以我的问题是:

> Windows消息的替代方案(跨平台)有哪些?回调可以取代消息吗?
>其他语言是否支持对象的回调?
>我猜其他语言有不同的技术作为消息的替代品?

解决方法

So my questions are:
What are the alternatives (cross-platform) to windows messages? Can callbacks replace messages?

是的,您可以使用回调替换消息.

Do other languages support callback of object?

您不应该使用对象方法作为回调.可移植代码中的常见做法是使用句柄(通知调用约定):

DLL源码:

type
  THandle = LongWord;
  {$IF SizeOf(THandle) < SizeOf(Pointer))}
  {$MESSAGE Error 'Invallid handle type'}
  {$ENDIF}

  TCallback = procedure(const aHandle: THandle); cdecl;

  var
      gCallback: record
        Routine: TCallback;
        Obj: TObject;
        Info: string
  end;

  function Object2Handle(const aObj: TObject): THandle;
  begin
    Result:= THandle(Pointer(aObj))
  end;

  function Handle2Object(const aHandle: THandle; out aObj: TObject): Boolean;
  begin
    if gCallback.Obj <> nil then
      if aHandle = Object2Handle(gCallback.Obj) then
      begin
        aObj:= gCallback.Obj;
        Result:= true;
        Exit // WARRNING: program flow disorder
      end;

    aObj:= nil;
    Result:= false
  end;

procedure DoCallback();
begin
  if Assigned(gCallback.Routine) then
    gCallback.Routine(Object2Handle(gCallback.Obj))
end;

procedure SetupCallback(const aCallback: TCallback); cdecl;
begin
  gCallback.Routine:= aCallback;
end;

procedure DoSomething(const aHandle: THandle; out aInfo: string); cdecl;
var
  O: TObject;
begin
  if Handle2Object(aHandle,O) then
    aInfo:= Format('%s class object %s',[O.ClassName(),gCallback.Info])
end;

procedure Test();
begin
  gCallback.Obj:= TStream.Create();
  try
    gCallback.Info:= 'created';
    DoCallback();
  finally
    FreeAndNil(gCallback.Obj)
  end;
  gCallback.Obj:= TMemoryStream.Create();
  try
    gCallback.Info:= 'will be freed';
    DoCallback();
  finally
    FreeAndNil(gCallback.Obj)
  end
end;

exports
  SetupCallback,DoSomething,Test;

可执行来源:

procedure Cb(const aHandle: THandle); cdecl;
const
  STUPID: THandle = 1;
  EQUALLY_STUPID = $DEAD;
var
  S: string;
begin
  DoSomething(STUPID,S);
  DoSomething(aHandle,S);
  DoSomething(EQUALLY_STUPID,S)
end;

begin
  SetupCallback(@Cb);
  Test()
end.

编辑:你现在不能射击自己.

I guess other languages have different technologies as alternative to messages?

操作系统有一些消息选择.然而,并不是很多真正便携

您还可以使用:

>插座,
>(IMO在这种情况下太大了?)准备好的消息系统(我最喜欢的0MQ)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读