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)
]

//在这里定义接口
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)

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

客户端代码

#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;
}
时间: 2024-09-30 09:34:56

ATL入门的相关文章

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

转载请注明出处:CN_Simo. 导语: Qt是一个跨平台的C++图形界面应用程序框架.它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序.Qt很容易扩展,并且允许真正地组件编程.基本上,Qt同X Window上的Motif,Openwin,GTK等图形界面库以及Windows平台上的MFC.OWL.VCL.ATL是同类型的东西. 本系列教程以Qt5.6为基础展开精讲. 参考书目: [1]霍亚飞.Qt Creator快速入门(第3版).2017年 [2]蔡

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

原文:COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM 原文:http://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-It 本文的目的是为刚刚接触COM的程序员提供编程指南,并帮助他们理解COM的基本概念.内容包括COM规范简介,重要的COM术语以及如何重用现有的COM组件.本文不包括如何编写自己的COM对象和接口. COM即组件对象模型,是Component

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

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

笔记:Spring Cloud Zuul 快速入门

Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了所有其他微服务的实例信息,这样的设计非常巧妙的将服务治理体系中维护的实例信息利用起来,使得维护服务实例的工作交给了服务治理框架自动完成,而对路由规则的维护,默认会将通过以服务名作为 ContextPath 的方式来创建路由映射,也可以做一些特别的配置,对于签名校验.登录校验等在微服务架构中的冗余问题

linux入门基础知识及简单命令介绍

linux入门基础知识介绍 1.计算机硬件组成介绍 计算机主要由cpu(运算器.控制器),内存,I/O,外部存储等构成. cpu主要是用来对二进制数据进行运算操作,它从内存中取出数据,然后进行相应的运算操作.不能从硬盘中直接取数据. 内存从外部存储中取出数据供cpu运存.内存的最小单位是字节(byte) 备注:由于32的cpu逻辑寻址能力最大为32内存单元.因此32位cpu可以访问的最大内存空间为:4GB,算法如下: 2^32=2^10*2^10*2^10*2^2 =1024*1024*1024

JAVA通信系列二:mina入门总结

一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http://www.cnblogs.com/juepei/p/3940396.html Apache Mina 入门实例--创建一个MINA时间服务http://loftor.com/archives/apache-mina-quick-start-guide.html MINA2.0用户手册中文版--系列文

Storm入门(四)WordCount示例

Storm API文档网址如下: http://storm.apache.org/releases/current/javadocs/index.html 一.关联代码 使用maven,代码如下. pom.xml  和Storm入门(三)HelloWorld示例相同 RandomSentenceSpout.java /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor lice

浅谈Ubuntu PowerShell——小白入门教程

早在去年八月份PowerShell就开始开源跨平台了,但是一直没有去尝试,叫做PowerShell Core. 这里打算简单介绍一下如何安装和简单使用,为还不知道PowerShell Core on Ubuntu的同学们提供一点小小的入门帮助,谢谢大家支持~ PowerShell Core是由Microsoft开发的运行在.Net Core上的开源跨平台的任务自动化和配置管理系统. 1.   在Ubuntu 16.04上安装PowerShell Core a)         导入公共存储库GP