在C ++,如何使用变体*将IDISPATCH*从服务器传递到客户端*

问题描述 投票:0回答:0
它们类型库将感兴趣的方法定义为:

[id(0x00000003)] SCODE GetEventHandler([out] VARIANT* Handler);

当我将类型库导入客户端时,它会生成以下方式:

SCODE GetEventHandler(VARIANT * Handler) { SCODE result; static BYTE parms[] = VTS_PVARIANT; InvokeHelper(0x3, DISPATCH_METHOD, VT_ERROR, (void*)&result, parms, Handler); return result; }
客户端代码是:

VARIANT eventHandlerVariant; VariantInit(&eventHandlerVariant); V_VT(&eventHandlerVariant) = VT_DISPATCH; V_DISPATCH(&eventHandlerVariant) = NULL; SCODE sCode = cAutomationServer.GetEventHandler(&eventHandlerVariant); IDispatch *eventHandler = V_DISPATCH(&eventHandlerVariant);
这是存根库中的调度地图:

BEGIN_DISPATCH_MAP(AutomationServer, CCmdTarget) DISP_FUNCTION_ID(AutomationServer, "GetEventHandler", 0x3, GetEventHandler, VT_ERROR, VTS_VARIANT) END_DISPATCH_MAP()
我在存根库中尝试了此实现:

SCODE AutomationServer::GetEventHandler(VARIANT *Handler) { AFX_MANAGE_STATE(AfxGetModuleState()); IDispatch *iDispatch = GetIDispatch(TRUE); V_DISPATCH(Handler) = iDispatch; return 0L; }

在这种情况下,客户对EventHandler的无效。
我在存根库中尝试了此实现:

SCODE AutomationServer::GetEventHandler(VARIANT *Handler) { AFX_MANAGE_STATE(AfxGetModuleState()); VARIANT variant; VariantInit(Handler); V_VT(Handler) = VT_DISPATCH; V_DISPATCH(Handler) = GetIDispatch(TRUE); *Handler = variant; }

在这种情况下,客户端捕获了带有消息“无效的callee”的colexception,将作业触发到 *处理程序。
我应该如何实现存根库方法?

答案(感谢igor)是将VTS_Variant更改为调度地图中的VTS_PVARIANT。我感到困惑,因为在afxdisp.h中的VTS_Variant的评论说“'const variant&'或'variant*'”。
	

c++ automation com ole
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.