回调函数不执行Delphi

时间:2014-06-26 16:34:12

标签: delphi callback

我的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将其传递给主线程。一切都按预期触发,但回调没有到达其他应用程序。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

确保在访问COM对象之前,为您开始的每个线程调用CoInitialize(nil);一次,在线程将运行的第一个代码中按优先顺序。