惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
有赞技术团队
有赞技术团队
Simon Willison's Weblog
Simon Willison's Weblog
人人都是产品经理
人人都是产品经理
L
LINUX DO - 最新话题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
小众软件
小众软件
Jina AI
Jina AI
The Cloudflare Blog
P
Palo Alto Networks Blog
AWS News Blog
AWS News Blog
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
L
Lohrmann on Cybersecurity
NISL@THU
NISL@THU
G
GRAHAM CLULEY
Project Zero
Project Zero
博客园_首页
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
Spread Privacy
Spread Privacy
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
Latest news
Latest news
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tor Project blog
S
Securelist
V
Vulnerabilities – Threatpost
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
IT之家
IT之家
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Last Watchdog
The Last Watchdog
T
Tenable Blog
宝玉的分享
宝玉的分享
S
Secure Thoughts
P
Privacy & Cybersecurity Law Blog
量子位
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Security Archives - TechRepublic
Security Archives - TechRepublic

博客园 - 如斯夫

Windows Azure中的Affinity Group .NET内存管理 .NET程序的运行与内存管理 堆栈和堆 应用程序的装载与运行 字符串匹配算法 – Sunday算法 该怎么教育 完成了吗? 技术人员面试流程泳道图 创建型模式 C# 面试题目 单链表中删除重复数据 C# 数据结构 单链表反转 C# 面试算法 人的问题 foreach中的隐式类型转换 C# 点滴 - 枚举 数据库惊魂 没有人能随随便便成功 If you are a new test manager – From google testing blog
COM学习
如斯夫 · 2010-05-06 · via 博客园 - 如斯夫

名词解释:

coclass: 是component object class的缩写,其中包含一个或者多个interface, coclass实现了这些接口;

COM object: 是coclass在内存中的实例

COM server: 是一个二进制文件(DLL 或者 Exe),其中包含一个或者多个coclass

Registration(注册): 创建注册表项,告诉Windows到哪里寻找COM server的过程

Guid: 每个interface或者coclass都有一个Guid, 还会看到uuid, 跟Guid是一回事

class ID, CLSID: 用来命名一个coclass;

interface ID, IID: 用来命名一个interface;

HRESULT: 一个整型数值,用来返回成功或者错误的代码

COM Library: 是操作系统的一部分, 当做与COM相关的事情的时候,与之交互

COM对象和标准Win32控件的区别

在使用标准win32控件的时候,首先要获得这个控件的句柄(handle, HWND),然后用sendmessage给它发送一个消息来操控它;同样,当控件要通知你什么消息或者给你传递一些数据时,它也要给你传递消息;

对于COM对象则不需要把消息传来传去.COM对象会给你一些特定的函数指针,你可以调用这些函数指针来操作COM对象;

COM对象和VTable

我们从一个简单的C的struct开始,我们定义一个struct:

struct IExample

{

DWORD count;

char buffer[80];

};

再用typedef来简化一下:

typedef struct

{

DWORD count;

char buffer[80];

} IEXample;

接下来,我们就可以使用这个struct了:

IExample* example;

example = (IExample*)GlobalAlloc(GMEM_FIXED, sizeof(IEXample));

example->count = 1;

example->buffer[0] = 0;

然后我们知道,struct中是可以包含函数指针的,假设我们现在有一个函数,这个函数有个字符指针的参数,返回值是long类型:

long SetString(char * str)

{

return (0);

}

这个时候我们就可以得到类似这样的代码:

#include <windows.h>

typedef long SetStringPtr(char *);

typedef struct
{
	SetStringPtr* SetString;
	DWORD count;
	char buffer[80];
} IExample;

long SetString(char *str)
{
	return (0);
}

int _tmain(int argc, _TCHAR* argv[])
{
	IExample* example;
	example = (IExample*)GlobalAlloc(GMEM_FIXED, sizeof(IExample));
	example->SetString = SetString;
	example->buffer[0] = 0;
	example->count = 1;

	long value = example->SetString("this is a test!");
	
	return 0;
}

但是,假如我们现在不想把函数指针直接存放在IExample内, 我们想要有一组函数指针.我们可以定义另一个struct,它的唯一的目的就是存放我们的函数指针,我们的代码就成了这个样子:

#include <windows.h>

typedef long SetStringPtr(char *);
typedef long GetStringPtr(char*, long);

typedef struct {
	SetStringPtr* SetString;
	GetStringPtr* GetString;
} IExampleVtbl;

typedef struct
{
	IExampleVtbl* lpVtbl;
	DWORD count;
	char buffer[80];
} IExample;

long SetString(char *str)
{
	return (0);
}

long GetString(char* str, long len)
{
	return 0;
}

static IExampleVtbl IExample_Vtbl = {SetString, GetString};

int _tmain(int argc, _TCHAR* argv[])
{
	IExample* example;
	
	example = (IExample*)GlobalAlloc(GMEM_FIXED, sizeof(IExample));
	example->lpVtbl = &IExample_Vtbl;
	example->buffer[0] = 0;
	example->count = 1;

	long value = example->lpVtbl->SetString("this is a test!");
	
	return 0;
}