【发布时间】: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 方法调用回调来解决的。