test ATL OCX by vs2015

来源:互联网 发布:做网站必备软件 编辑:程序博客网 时间:2024/04/17 02:28

很久不玩ATL, 已经忘了怎么用vs的向导搭框架, 尴尬。
回来做个实验, 本来要用vs10来实验, 可是家里只有vs13和vs15.
就拿vs15来做实验吧, 新版的vs和msdn吻合度较高。
以前都是用vc6生成控件框架, 然后用vs10等高版本打开转换。
今天在win10x64上发现, 以前攒下的ocx demo, 在win10上都编译不过,懵逼了一会。
msdn对新版vs使用ATL给出的帮助还是挺详细的。

实验

目标: 做个能在win10下正常被IE加载的ATL OCX, 在静态测试页面中写JS代码, 调用OCX中的一个方法, 传入一个字符串参数, 传出一个字符串参数。

实验效果

这里写图片描述

工程下载点

src_test_atl_ocx.zip
编译环境:win10x64 + vs2015 + ATL

搭建ATL工程框架

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

向ATL工程中添加ATL OCX

切换到classview
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这时是编译不过的, 要修改工程设置。
这里写图片描述
现在可以编译过了

向ATL控件添加一个可用方法

添加一个可用控件方法, 准备干活了, 要求有入参,有出参。
这里写图片描述
这里写图片描述
这里写图片描述

实现定义的接口

这里写图片描述

接口的实现代码

STDMETHODIMP ClsTestOcx::SetAndGetValue(BSTR strIn, BSTR* strRc){    // strIn is in    // strRc is out and retval    USES_CONVERSION;    LPCSTR pcstrVariable = W2A(strIn);    // TODO: Add your implementation code here    MessageBoxA(NULL, pcstrVariable, "ClsTestOcx::SetAndGetValue", MB_OK);    if (NULL != strRc) {        *strRc = SysAllocString(L"2017-0816");    }    return S_OK;}

写测试用的静态网页

vs向导在添加ATL OCX后, 生成了一个加载OCX的htm, 挺贴心的。
修改这个htm, 调用控件的方法, 给入参, 使用出参。

<HTML><HEAD><TITLE>ATL test page for object lsTestOcx</TITLE>    <script type="text/javascript">        function fn_test()        {            var tmp;            var myOcx;            msg_set(">> fn_test\r\n");            myOcx = document.getElementById('lsTestOcx');            myOcx.About(); // 无参函数            tmp = "in param";            tmp = myOcx.SetAndGetValue(tmp);            msg_append(tmp);        }        function msg_empty()        {            textarea_msg_area.value = "";        }        function msg_set(x)        {            textarea_msg_area.value = x;        }        function msg_append(x)        {            textarea_msg_area.value += x;        }    </script>  </HEAD><BODY>    <textarea name="textarea_msg_area" rows="10" cols="100">        在按下"testcase"按钮后,开始测试    </textarea>    <br>    <br>    <input type="button" onclick="fn_test()" value="testcase" />      <OBJECT ID="lsTestOcx" CLASSID="CLSID:B99E5CE0-5CA0-4615-BEFA-BFCB5A520F68"></OBJECT></BODY></HTML>