// CalcSink.h
class CCalcSink : public IDispEventImpl<
0,
CCalcSink,
&DIID__IMyCalcEvents,
&LIBID_CALCLib,
1,
0>
{
public:
// 事件响应
HRESULT __stdcall OnGiveResult(long vRet);
HRESULT __stdcall OnGiveResultEx(VARIANT *pvRet);
HRESULT __stdcall OnGiveVarResult(VARIANT vRet); // 构造与析构函数
CCalcSink();
virtual ~CCalcSink();

// 接收器映射
BEGIN_SINK_MAP(CCalcSink)
SINK_ENTRY_EX( 0, DIID__IMyCalcEvents, 3, OnGiveResult )
SINK_ENTRY_EX( 0, DIID__IMyCalcEvents, 2, OnGiveResultEx )
SINK_ENTRY_EX( 0, DIID__IMyCalcEvents, 1, OnGiveVarResult )
END_SINK_MAP()
};// CalcSink.cpp
#include "stdafx.h"
#include "CalcSink.h"
CCalcSink::CCalcSink()
{}CCalcSink::~CCalcSink()
{}
// 以下三个测试结果只有参数为long 的能进行自动化调度,这是为什么呢?
HRESULT CCalcSink::OnGiveVarResult(VARIANT vRet)
{
ASSERT(vRet.vt == VT_I4);
TRACE("call OnGiveResult<ret = %d>.\n", vRet.lVal);//失败

return S_OK;
}HRESULT CCalcSink::OnGiveResultEx(VARIANT *pvRet)
{
TRACE("call OnGiveResult<ret = %d>.\n", pvRet->lVal);//失败 return S_OK;
}HRESULT CCalcSink::OnGiveResult(long vRet)
{
TRACE("call OnGiveResult<ret = %d>.\n", vRet);//成功

return S_OK;
}请高手帮忙,谢谢!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    上网查下VARIANT的可用定义类型
      

  2.   

    问题已经解决,VC开发环境为我产生的代理函数有问题。
    HRESULT Fire_GiveResult(VARIANT vRes)
    {
    CComVariant varResult;
    T* pT = static_cast<T*>(this);
    int nConnectionIndex;
    CComVariant* pvars = new CComVariant[1];
    int nConnections = m_vec.GetSize();

    for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
    {
    pT->Lock();
    CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
    pT->Unlock();
    IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
    if (pDispatch != NULL)
    {
    VariantClear(&varResult);
    pvars[0] = vRes; //这里自动产生的是&vRes,而我需要的是vRes DISPPARAMS disp = { pvars, NULL, 1, 0 };
    pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
    }
    }
    delete[] pvars;
    return varResult.scode;

    }