我的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将其传递给主线程。一切都按预期触发,但回调没有到达其他应用程序。
我在这里做错了什么?
答案 0 :(得分:1)
确保在访问COM对象之前,为您开始的每个线程调用CoInitialize(nil);
一次,在线程将运行的第一个代码中按优先顺序。