如何编写ATL控件

创建ATL控件

点击菜单File-New

 点击按钮OK

点击按钮Finish

点击按钮OK

点击菜单Insert-New ATL Object

点击按钮Next

点击按钮确定

加入方法

右键点击窗口Class-Ixxxx

点击右键菜单Add Method

点击按钮OK

参数框输入:

[in] int *piIValue, [out,retval] int *piORValue

表示输入参数:int * piIValue,返回值类型:int

对应于xxxx.h中的

STDMETHOD(Fun)(/*[in]*/ int *piIValue, /*[out,retval]*/ int *piORValue);

和xxxx.cpp中的

STDMETHODIMP CDemo::Fun(int *piIValue, int *piORValue)

加入属性

右键点击窗口Class-Ixxxx

点击右键菜单Add Property

点击按钮OK

(GetFunction输出函数,对应于xxxx.h中的

STDMETHOD(get_Var)(/*[out, retval]*/ BSTR *pVal); 和xxxx.cpp中的STDMETHODIMP CDemo::get_Var(BSTR *pVal);

PutFunction输入函数,对应于xxxx.h中的

STDMETHOD(put_Var)(/*[in]*/ BSTR newVal);和xxxx.cpp中的STDMETHODIMP CDemo::put_Var(BSTR newVal));

加入事件

右键点击窗口Class-_IxxxxEvents

点击右键菜单Add Method

点击按钮OK

(所有事件函数添加完毕,再执行下面的操作)

右键点击窗口File-xxxxCOM.idl

点击右键菜单Compile xxxxCOM.idl

右键点击窗口Class-Cxxxx

点击右键菜单Implement Connection Point

点击按钮OK

(使用方法:在函数中直接调用Fire_FireFun();,上层应用实现该函数并响应调用)

修改方法参数

修改以下3处

xxxx.h中

STDMETHOD(Fun)(/*[in]*/ int *piIValue, /*[out,retval]*/ int *piORValue);

xxxx.cpp中

STDMETHODIMP CDemo::Fun(int *piIValue, int *piORValue)

xxxxCOM.idl中

[id(1), helpstring("method Fun")] HRESULT Fun([in] int *piIValue, [out,retval] int *piORValue);

处理返回值

返回值需要单独赋值处理,不能直接return,如下所示

*piORValue = 0;

*piORValue = -1;

同步异步

同步:在接口函数中做循环处理

异步:控件一开始开启线程,每次调用接口函数时检测一下线程是否活着,并通过设置事件句柄的信号量来控制线程是否运行到特定的循环中(注意事件句柄的名字设置为NULL,让系统自己来管理事件句柄,可有效地防止外部程序非法修改事件句柄的信号量)

测试工具导入控件

点击菜单File-New

点击按钮OK

点击按钮Finish

点击按钮OK

右键点击窗口Resource-Dialog-IDD_TESTxxxxCOM_DIALOG

点击右键菜单Insert ActiveX Control

点击按钮OK

右键点击COM控件(刚添加的)

点击右键菜单ClassWizard

点击按钮Add Variable

点击按钮确定

点击按钮OK

点击按钮OK

点击按钮OK

右键点击COM控件(刚添加的)

点击右键菜单ClassWizard

双击窗口Messages里的函数

点击按钮OK

点击按钮OK

最后吐槽一下,微软的VS越来越不友好了,以VS2020为例,用来写ATL,复杂了不止一倍

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

skyksksksksks

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

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

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

打赏作者

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

抵扣说明:

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

余额充值