Atl ActiveX控件事件不执行

1  注意: 在atl做active控件时,事件参数 不能用 USHORT  ULONG等类型,因为不支持这种类型,导致事件不调用

2. 情况如下:

事件接口为

dispinterface _ITestEvents
{
  properties:
  methods:
  [id(1), helpstring("method TestEvent")] void TestEvent([in] long a, [in] long b, [in] BSTR Text);
};

在连接点代理类中:
template <class T>
class CProxy_ITestEvents : public IConnectionPointImpl<T, &DIID__ITestEvents, CComDynamicUnkArray>
{
 //Warning this class may be recreated by the wizard.
public:
 VOID Fire_TestEvent()
 {
    T* pT = static_cast<T*>(this);

    int nConnectionIndex;
    CComVariant* pvars = new CComVariant[3];
    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 )
{
    pvars[0].vt = VT_I4;
    pvars[0].lVal = pInfo->IsSuccessful();
    pvars[1].vt = VT_I4;
    pvars[1].lVal = pInfo->ErrorCode();

             //通过下面的pDispatch->Invoke(0x01, ...)回调客户的事件代码,但是当有中文字符时却无法触发客户端的事件,错误:Warning: automation argument coercion 

             //方法1:
    pvars[2] = "abbbbdd";     //不行, Warning: automation argument coercion failed.
             //方法2:
    pvars[2].vt = VT_BSTR;
    pvars[2].bstrVal = _com_util::ConvertStringToBSTR("23456");  //可以,没有中文字符。

             //方法3:
    pvars[2].vt = VT_BSTR;
    pvars[2].bstrVal = _com_util::ConvertStringToBSTR("哈哈");  //不可以,有中文字符。Warning: automation argument coercion failed.

    DISPPARAMS disp = { pvars, NULL, 3, 0 };
    pDispatch->Invoke(0x01, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
}
      }
      delete [] pvars;

}

原因分析:参数的顺序颠倒了.

接口声明为:[id(1), helpstring("method TestEvent")] void TestEvent([in] long a, [in] long b, [in] BSTR Text);

pvars[0] 应该对应Test,pvars[1] 应该对应b,pvars[3] 应该对应a

使用CComBSTR() 或 _com_util::ConvertStringToBSTR("哈哈") 或 SysAllocString(L"哈哈") 都可以。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starhuhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值