服务端代码------------------------------------------------------------------------------------------------------------------------------------------------------------

altstopwatch.idl [接口定义文件]

  1. // altstopwatch.idl : IDL source for altstopwatch
  2. //
  3.  
  4. // This file will be processed by the MIDL tool to
  5. // produce the type library (altstopwatch.tlb) and marshalling code.
  6.  
  7. import "oaidl.idl";
  8. import "ocidl.idl";
  9.  
  10. [
  11. object,
  12. uuid(FD2BE6F3-9074-47F3-9884-FDD3DE13D158),
  13. pointer_default(unique)
  14. ]
  1. </pre><pre code_snippet_id="458982" snippet_file_name="blog_20140827_3_5235692" name="code" class="plain">//在这里定义接口
  2. interface Istopwatch : IUnknown{
  1. <span style="white-space:pre"> </span> //同样的属性(都指向同一个成员变量),ID值同样
  2. <strong><span style="font-size:18px;color:#ff0000;"> [propget, id(1), helpstring("取值")] HRESULT name ([out ,retval] BSTR *val);
  3. [propput, id(1), helpstring("设值")] HRESULT name([in] BSTR val);</span></strong>
  4. };
  5.  
  6. [
  7. uuid(A4E51DE3-D343-4CB2-A901-5CE1D2067309),
  8. version(1.0),
  9. ]
  10. library altstopwatchLib
  11. {
  12. importlib("stdole2.tlb");
  13. [
  14. uuid(FD3216FD-B513-40F1-BE2C-72B2954D1368),
  15. helpstring("help string stopwatch class")
  16. ]
  17. coclass stopwatch
  18. {
  19. [default] interface Istopwatch;
  20. };
  21. };

stopwatch.h [接口定义头文件]

  1. // stopwatch.h : Declaration of the Cstopwatch
  2.  
  3. #pragma once
  4. #include "resource.h" // main symbols
  5.  
  6. #include "altstopwatch_i.h"
  7.  
  8. #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
  9. #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."
  10. #endif
  11.  
  12. using namespace ATL;
  13.  
  14. // Cstopwatch
  15.  
  16. class ATL_NO_VTABLE Cstopwatch :
  17. public CComObjectRootEx<CComSingleThreadModel>,
  18. public CComCoClass<Cstopwatch, &CLSID_stopwatch>,
  19. public Istopwatch
  20. {
  21. public:
  22. Cstopwatch()
  23. {
  24. }
  25.  
  26. DECLARE_REGISTRY_RESOURCEID(IDR_STOPWATCH)
  27.  
  28. BEGIN_COM_MAP(Cstopwatch)
  29. COM_INTERFACE_ENTRY(Istopwatch)
  30. END_COM_MAP()
  31.  
  32. DECLARE_PROTECT_FINAL_CONSTRUCT()
  33.  
  34. HRESULT FinalConstruct()
  35. {
  36. return S_OK;
  37. }
  38.  
  39. void FinalRelease()
  40. {
  41. }
  42.  
  43. public:
  1. //将接口进行实现
  2. <strong><span style="font-size:18px;color:#ff6600;">public:
  3. virtual /* [helpstring][id][propget] */ HRESULT STDMETHODCALLTYPE get_name(
  4. /* [retval][out] */ BSTR *val)
  5. {
  6. m_name.CopyTo(val);
  7. return S_OK;
  8. }
  9.  
  10. virtual /* [helpstring][id][propput] */ HRESULT STDMETHODCALLTYPE put_name(
  11. /* [in] */ BSTR val)
  12. {
  13. m_name.AssignBSTR(val);
  14. return S_OK;
  15. }</span></strong>
  16.  
  17. private:
  18. CComBSTR m_name;
  19.  
  20. };
  21.  
  22. OBJECT_ENTRY_AUTO(__uuidof(stopwatch), Cstopwatch)

###############################################################################################################################

client代码

  1. #include <Windows.h>
  2. #include <atlbase.h>
  3. #include <atlcom.h>
  4. #include <stdio.h>
  5.  
  6. #import "../Debug/altstopwatch.dll" named_guids no_namespace
  7.  
  8. void test()
  9. {
  10. CoInitialize(NULL);
  11.  
  12. {
  13. CComPtr<Istopwatch> ptr ;
  14. HRESULT hr = ptr.CoCreateInstance(CLSID_stopwatch, NULL, CLSCTX_ALL);
  15. assert((SUCCEEDED(hr)));
  16.  
  17. //因为我之前写成了
  18. //BSTR s = L"test"
  19. //所以::SysAllocStringByteLen算出来一直是0 汗啊!!!!!!!!!!!!!!
  20. BSTR s = ::SysAllocString(L"test");
  21.  
  22. //对这个进行求值的字符串。必须由::SysAllocByte分配
  23. int len = ::SysStringByteLen(s);
  24. int len2 = ::SysStringByteLen(L"ffffff");
  25. assert(len==8);
  26. assert(len2 == 0);
  27.  
  28. BSTR m_str = ::SysAllocStringByteLen((char*)s, len);
  29. ptr->put_name(s);
  30. BSTR sr = NULL;
  31. ptr->get_name(&sr);
  32.  
  33. int r = wcscmp(s, sr);
  34. assert(r == 0);
  35.  
  36. ::SysFreeString(s);
  37. printf("access resource success!");
  38. }
  39.  
  40. CoUninitialize();
  41. }
  42.  
  43. int main(int argc, char *argv[])
  44. {
  45. test();
  46. getchar();
  47. return 0;
  48. }

ATL入门的更多相关文章

  1. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

  2. Qt入门之基础篇(1):Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  3. Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...

  4. Qt入门之基础篇 ( 一 ) :Qt4及Qt5的下载与安装

    转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且 ...

  5. 【转载】COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM

    原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-CO ...

  6. <2013 12 01> 一篇很好的关于windows编程的入门指导(2013年末写的,比较前沿)

    我之前做了不少嵌入式开发,从单片机到ARM到RTOS到Linux等等,可以说走的是电气工程师的路线,对编程也是实用性的,跟计算机学院的科班套路不同.最近同学做一个windowsCE的项目请我帮忙,之前 ...

  7. COM编程快速入门

    COM编程快速入门 COM编程快速入门 http://www.vckbase.com/index.php/wv/1642   COM是一种跨应用和语言共享二进制代码的方法.与C++不同,它提倡源代码重 ...

  8. 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)

    Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...

  9. duilib教程之duilib入门简明教程17.事件处理和消息响应

    界面的显示方面就都讲完啦,下面来介绍下控件的响应.    前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEGIN_ME ...

随机推荐

  1. Linux 内建命令和系统命令

    shell内建命令是指bash(或其它版本)工具集中的命令.一般都会有一个与之同名的系统命令,比如bash中的echo命令与/bin/echo是两个不同的命令,尽管他们行为大体相仿.当在bash中键入 ...

  2. 【2017 Multi-University Training Contest - Team 2】 Is Derek lying?

    [Link]: [Description] 两个人都做了完全一样的n道选择题,每道题都只有'A','B','C' 三个选项,,每道题答对的话得1分,答错不得分也不扣分,告诉你两个人全部n道题各自选的是 ...

  3. JS-网页中分页栏

    原理 三部分 我给分页栏分成了3部分 上一页:调用prePage()函数 下一页:调用nextPage()函数 带有数字标识的部,调用skipPage()函数 prePage函数 function p ...

  4. CDN服务上线,DNSPOD布局云端生态圈

    爱因斯坦曾说过,我从不去想未来,由于它来得已经够快的了.是的,随着互联网的高速发展,我们的生活节奏越来越快,可是人们的耐心却像鞋底一样越磨越薄. 遥控器按一下,鼠标点一下,仅仅要认为没意思或者等待时间 ...

  5. Codeforces Round #193 (Div. 2) 部分题解

    A:直接判断前三项是否相等 int main() { //FIN; //CHEAT; int n; cin>>n; getchar(); ]; gets(a); int len = str ...

  6. 数组-reduce方法

    转自: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/139 实现 convert 方法,把原始 list ...

  7. Vue Invalid handler for event "": got undefined

    原因:绑定的方法不是放在methods:{}里.比如我把绑定的函数写在了computed:{}里就会报这个错.

  8. vmware workstation安装windows server 2019

    提示需要输入密钥,选择[我没有密钥] 选择有桌面体验的 自定义 新建C盘 100G 选择100G的主分区,下一步 PS:未分配的空间,先不理,安装完系统,进桌面,再分配 开始安装.接下来就是等. 等. ...

  9. ArcGIS 点要素新增点

    IFeatureLayer layer = FrmMain.m_mapControl.get_Layer(0) as IFeatureLayer; IFeatureClass featureClass ...

  10. [Redux] Understand Redux Higher Order Reducers

    Higher Order Reducers are simple reducer factories, that take a reducer as an argument and return a ...