ATL入门
服务端代码------------------------------------------------------------------------------------------------------------------------------------------------------------
altstopwatch.idl [接口定义文件]
- // altstopwatch.idl : IDL source for altstopwatch
- //
- // This file will be processed by the MIDL tool to
- // produce the type library (altstopwatch.tlb) and marshalling code.
- import "oaidl.idl";
- import "ocidl.idl";
- [
- object,
- uuid(FD2BE6F3-9074-47F3-9884-FDD3DE13D158),
- pointer_default(unique)
- ]
- </pre><pre code_snippet_id="458982" snippet_file_name="blog_20140827_3_5235692" name="code" class="plain">//在这里定义接口
- interface Istopwatch : IUnknown{
- <span style="white-space:pre"> </span> //同样的属性(都指向同一个成员变量),ID值同样
- <strong><span style="font-size:18px;color:#ff0000;"> [propget, id(1), helpstring("取值")] HRESULT name ([out ,retval] BSTR *val);
- [propput, id(1), helpstring("设值")] HRESULT name([in] BSTR val);</span></strong>
- };
- [
- uuid(A4E51DE3-D343-4CB2-A901-5CE1D2067309),
- version(1.0),
- ]
- library altstopwatchLib
- {
- importlib("stdole2.tlb");
- [
- uuid(FD3216FD-B513-40F1-BE2C-72B2954D1368),
- helpstring("help string stopwatch class")
- ]
- coclass stopwatch
- {
- [default] interface Istopwatch;
- };
- };
stopwatch.h [接口定义头文件]
- // stopwatch.h : Declaration of the Cstopwatch
- #pragma once
- #include "resource.h" // main symbols
- #include "altstopwatch_i.h"
- #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
- #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
- #endif
- using namespace ATL;
- // Cstopwatch
- class ATL_NO_VTABLE Cstopwatch :
- public CComObjectRootEx<CComSingleThreadModel>,
- public CComCoClass<Cstopwatch, &CLSID_stopwatch>,
- public Istopwatch
- {
- public:
- Cstopwatch()
- {
- }
- DECLARE_REGISTRY_RESOURCEID(IDR_STOPWATCH)
- BEGIN_COM_MAP(Cstopwatch)
- COM_INTERFACE_ENTRY(Istopwatch)
- END_COM_MAP()
- DECLARE_PROTECT_FINAL_CONSTRUCT()
- HRESULT FinalConstruct()
- {
- return S_OK;
- }
- void FinalRelease()
- {
- }
- public:
- //将接口进行实现
- <strong><span style="font-size:18px;color:#ff6600;">public:
- virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_name(
- /* [retval][out] */ BSTR *val)
- {
- m_name.CopyTo(val);
- return S_OK;
- }
- virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_name(
- /* [in] */ BSTR val)
- {
- m_name.AssignBSTR(val);
- return S_OK;
- }</span></strong>
- private:
- CComBSTR m_name;
- };
- OBJECT_ENTRY_AUTO(__uuidof(stopwatch), Cstopwatch)
###############################################################################################################################
client代码
- #include <Windows.h>
- #include <atlbase.h>
- #include <atlcom.h>
- #include <stdio.h>
- #import "../Debug/altstopwatch.dll" named_guids no_namespace
- void test()
- {
- CoInitialize(NULL);
- {
- CComPtr<Istopwatch> ptr ;
- HRESULT hr = ptr.CoCreateInstance(CLSID_stopwatch, NULL, CLSCTX_ALL);
- assert((SUCCEEDED(hr)));
- //因为我之前写成了
- //BSTR s = L"test"
- //所以::SysAllocStringByteLen算出来一直是0 汗啊!!!!!!!!!!!!!!
- BSTR s = ::SysAllocString(L"test");
- //对这个进行求值的字符串。必须由::SysAllocByte分配
- int len = ::SysStringByteLen(s);
- int len2 = ::SysStringByteLen(L"ffffff");
- assert(len==8);
- assert(len2 == 0);
- BSTR m_str = ::SysAllocStringByteLen((char*)s, len);
- ptr->put_name(s);
- BSTR sr = NULL;
- ptr->get_name(&sr);
- int r = wcscmp(s, sr);
- assert(r == 0);
- ::SysFreeString(s);
- printf("access resource success!");
- }
- CoUninitialize();
- }
- int main(int argc, char *argv[])
- {
- test();
- getchar();
- return 0;
- }
ATL入门的更多相关文章
- 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...
- Qt入门之基础篇(1):Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...
- Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装
转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...
- 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM
原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...
- <2013 12 01> 一篇很好的关于windows编程的入门指导(2013年末写的,比较前沿)
我之前做了不少嵌入式开发,从单片机到ARM到RTOS到Linux等等,可以说走的是电气工程师的路线,对编程也是实用性的,跟计算机学院的科班套路不同.最近同学做一个windowsCE的项目请我帮忙,之前 ...
- COM编程快速入门
COM编程快速入门 COM编程快速入门 http://www.vckbase.com/index.php/wv/1642 COM是一种跨应用和语言共享二进制代码的方法.与C++不同,它提倡源代码重 ...
- 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...
- duilib教程之duilib入门简明教程17.事件处理和消息响应
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEGIN_ME ...
随机推荐
- Linux 内建命令和系统命令
shell内建命令是指bash(或其它版本)工具集中的命令.一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令,尽管他们行为大体相仿.当在bash中键入 ...
- 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?
[Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...
- JS-网页中分页栏
原理 三部分 我给分页栏分成了3部分 上一页:调用prePage()函数 下一页:调用nextPage()函数 带有数字标识的部,调用skipPage()函数 prePage函数 function p ...
- CDN服务上线,DNSPOD布局云端生态圈
爱因斯坦曾说过,我从不去想未来,由于它来得已经够快的了.是的,随着互联网的高速发展,我们的生活节奏越来越快,可是人们的耐心却像鞋底一样越磨越薄. 遥控器按一下,鼠标点一下,仅仅要认为没意思或者等待时间 ...
- Codeforces Round #193 (Div. 2) 部分题解
A:直接判断前三项是否相等 int main() { //FIN; //CHEAT; int n; cin>>n; getchar(); ]; gets(a); int len = str ...
- 数组-reduce方法
转自: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/139 实现 convert 方法,把原始 list ...
- Vue Invalid handler for event "": got undefined
原因:绑定的方法不是放在methods:{}里.比如我把绑定的函数写在了computed:{}里就会报这个错.
- vmware workstation安装windows server 2019
提示需要输入密钥,选择[我没有密钥] 选择有桌面体验的 自定义 新建C盘 100G 选择100G的主分区,下一步 PS:未分配的空间,先不理,安装完系统,进桌面,再分配 开始安装.接下来就是等. 等. ...
- ArcGIS 点要素新增点
IFeatureLayer layer = FrmMain.m_mapControl.get_Layer(0) as IFeatureLayer; IFeatureClass featureClass ...
- [Redux] Understand Redux Higher Order Reducers
Higher Order Reducers are simple reducer factories, that take a reducer as an argument and return a ...