【问题标题】:Callback function not executing Delphi回调函数不执行 Delphi
【发布时间】:2014-06-27 02:24:39
【问题描述】:

我的 com 对象中有一个方法,它被实现为下面定义的回调广告:

FCallBackMethod: IDispatch;

要触发回调,我调用以下函数

procedure TCallback.SignalCallbackAsString(const AJSonMessage: String);
var Args : array[0..0] of TVariantArg;
begin
  Args[0] := StrToVariantArg(AJSonMessage);
  Logger.Trace('Signaling callback ' + AJSonMessage);
  InvokeMethod(FCallBackMethod, Args);
  SysFreeString(Args[0].bstrVal);
end;

InvokeMethod 定义为:

procedure InvokeMethod(Method: IDispatch; pArgs: array of TVariantArg);
var
  DispParams: TDispParams;
  InvKind: Integer;
  ArgCount: Integer;
begin
  if VarIsNull(Method) or VarIsEmpty(Method) or VarIsClear(Method) then
      Exit;

    FillChar(DispParams, sizeof(DispParams), 0);

    ArgCount := High(pArgs) - Low(pArgs) + 1;

    FillChar(DispParams, sizeof(DispParams), 0);
    InvKind := DISPATCH_METHOD;

    DispParams.rgvarg := PVariantArgList(@pArgs);
    DispParams.cArgs := ArgCount;

    Method.Invoke(0, GUID_NULL, 0, InvKind, DispParams, nil, nil, nil);
end;

如果我在主窗体中添加一个按钮,则使用 Callback.SignalCallbackAsString(TCPMessageRead); 调用它 一切都按预期工作。

但是,当我从线程触发它时,我不起作用。我认为从单独的线程执行它是一个问题,所以我通过使用“SendMessage”发送 TCPMessageRead 将它传递给主线程。一切都按预期触发,但回调没有到达其他应用程序。

我在这里做错了什么?

【问题讨论】:

  • 你能告诉我们更多关于整个架构以及如何处理线程的信息吗? COM 对象是什么?是COM服务器吗?进程内,进程外? COM 服务器的线程模型呢? COM 初始化了吗?谁创建线程? COM 服务器还是 COM 客户端?就目前而言,我发现要弄清楚这里到底发生了什么有点困难。
  • 感谢您的快速回复大卫。我实际上是通过从 Synchronize 方法调用回调来解决的。

标签: delphi callback


【解决方案1】:

确保在访问 COM 对象之前,为每个启动的线程调用一次CoInitialize(nil);,优先选择线程将运行的第一个代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多