Delphi COM Server," GetFunctionPointerForDelegate"回调:同步?

时间:2017-11-25 10:34:35

标签: multithreading delphi callback com interop

应用程序是围绕使用进程内COM服务器作为插件的独立应用程序构建的。通信插件通过interop与C#层连接,并在调用C#异步连接方法(本身使用C#线程)" GetFunctionPointerForDelegate"用于通知状态已更改为Delphi COM服务器。

  • 独立应用程序(Delphi .exe)
    • 进程内COM服务器(Delphi .dll / regsvr32)
      • C#interop通信层(C#.dll assemblies / regasm)

看起来不同的threadID是在记录回调方法收到的threadID之后通过回调指针回调Delphi COM服务器。由于这些回调是异步接收的(afaik),我想知道它是否需要:

a)在触发时直接处理它们(在调用线程上下文中?):

Application.mainthreadID
 - COM Server threadId
    - callback (threadId=1) : callback processing...
    - callback (threadId=2) : callback processing...

b)将这些回调发送到COM服务器mainthread(在COM服务器线程上下文中处理它们):

Application.mainthreadID
 - COM Server threadId
     - custom dynamic "WndProc"
        - callback (threadId=1) : Dispatch/PostMessage...
        - callback (threadId=2) : Dispatch/PostMessage...

为了将这些C#回调分派给COM服务器mainthread,使用自定义" WndProc"动态创建窗口子类(在COM服务器内)。接收自定义WM_XXX调度消息:

TFooCOMServer.CallbackEntryPoint1(...)
 PostMessage(hWnd, WM_CUSTOM_CALLBACK1, wParam, lParam);

TFooCOMServer.CustonWndProc( Msg : TMesssage);
 ...
  Case Msg.message of
    WM_CUSTOM_CALLBACK1 : OnCustomCallBack(param1,param2);
     ...
  end;

我对这个COM /多线程应用程序模式的疑问是:

  • 这个调度员是否有感觉?是否值得同时通过" WndProc"进程消息回调处理?
  • 如果是,回调方法参数应如何从回调入口点编组到" WndProc"调度员目标?如果是接口参数类型(通过PostMessage调度" lParam或wParam"整数),如何安全地调度此接口指针以及接口引用计数/生命周期,我应该增加还是编组(到#34; WndProc" thread)这些接口指针?

提前感谢您对此主题的帮助。

0 个答案:

没有答案