序
很久不玩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>