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

推荐订阅源

W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
F
Full Disclosure
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threatpost
I
Intezer
V2EX - 技术
V2EX - 技术
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
小众软件
小众软件
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
N
News | PayPal Newsroom
MyScale Blog
MyScale Blog
AI
AI
Vercel News
Vercel News
Spread Privacy
Spread Privacy
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
U
Unit 42
L
LangChain Blog
Recent Announcements
Recent Announcements

博客园 - Zzx飘遥

发布一个注册类型库(TypeLib)的小工具 【软件发布】发布一个查单词的小工具 COM 入门(4) COM 入门(2) COM 入门(1) C#内嵌汇编代码的讨论 仿Win7显示桌面的工具 Deep Zoom Composer初探 ASP.NET VirtualPathProvider (下) Silverlight3离线运行 [译]理解Windows消息循环 WPF BitmapImage与byte[]的转换 VC++中启用XP主题外观 C#4.0初探:dynamic 关键字 - Zzx飘遥 - 博客园 四个字节整型转换为IP格式 - Zzx飘遥 - 博客园 拯救开启桌面效果后白屏的openSUSE 遭遇SqlDataReader锁定表 软件更新:网页设计师必备 之 网站截图工具 (附源码) C#4.0初探: Optional and named parameters
COM 入门(3)
Zzx飘遥 · 2010-08-31 · via 博客园 - Zzx飘遥

本篇介绍COM注册TypeLib,CLR程序调用COM组件;注册ProgID及ProgID和CLSID相互映射等。

1. 注册TypeLib
IDL在MIDL编译后会生成一个.tlb文件,这个文件包含TypeLibrary信息,为使我们写的COM组件供.NET或VB等程序调用,注册类型库是必须的。我们可以直接注册生成的tlb文件,但为了便于部署,可以将tlb文件作为资源嵌dll中。
新建一个rc文件,添加如下代码:

1 TypeLib "Debug\\BeginningCOM.tlb"

这里的TypeLib的ID通常为1,注册TypeLib的时候直接使用dll路径及文件名即可,否则需要在路径文件名后加上"\TypeLib在rc文件中的ID"。
注册TypeLib可以使用直接写注册表的方式和调用API注册,建议使用后者,因为调用API时会对TypeLib的合法性进行验证。

//register typelib
ITypeLib *pTypeLib;
hr
= LoadTypeLibEx(szFileName, REGKIND_REGISTER, &pTypeLib);
pTypeLib
-> Release(); //unregister type
UnRegisterTypeLib(LIBID_BEGINNINGCOMLib, 1, 0, LANG_NEUTRAL, SYS_WIN32);

LoadTypeLibEx函数会加载COM组件,取得ITypeLib接口实例并注册TypeLib。
LIBID_BEGINNINGCOMLib是MIDL编译idl文件时从idl文件获得的library的ID。

COM类型库注册后会在注册表中写入如下信息:

[HKEY_CLASSES_ROOT\TypeLib\{D9161D4D-66C0-4AE6-9264-C322BDE034C7}\1.0]
@
="BeginningCOMLib"

[HKEY_CLASSES_ROOT\TypeLib\{D9161D4D

-66C0-4AE6-9264-C322BDE034C7}\1.0\0\win32]
@
="E:\\Projects\\BeginningCOM\\Debug\\BeginningCOM.dll"
//...

2. CLR调用COM组件
CLR调用COM组件可以用tlbimp工具生成代理类,也可以直接在VS中添加引用,这里我们仅实验后者。
VS中新建一个Console Application,添加引用,COM列表中,Componment Name列中列出了我们刚刚创建的COM组建,添加BeginningCOMLib类型库。然后编写代码:

static void Main(string[] args)
{
    BeginningCOM bc
= new BeginningCOM();
    Console.WriteLine(bc.Sum(
1, 2));

    bc.Num

= int.MaxValue;
    Console.WriteLine(bc.Num);

    Console.ReadKey();
}

运行,输出了我们预期的结果。64位系统要注意,如果COM组件编译为x86平台,.NET程序也要编译为x86平台,否则会抛出类没有注册的错误。

3. 注册ProgID
ProgID和CLSID基本上是一一对应的,CLSID是GUID形式,能保证其唯一性;而ProgID比较易读易记,并且脚本语言一般用ProgID来调用COM组件。
注册ProgID只需在注册表中写入一些键值即可,ProgID习惯的命名方式是组件.版本。为注册ProgID,RegTable数组的内容如下:

LPCTSTR RegTable[][3] =
{
    {L
"CLSID\\{586CDC7B-09F1-4f44-A110-F0E604AED81E}", 0, L"BeginningCOM"},
    {L
"CLSID\\{586CDC7B-09F1-4f44-A110-F0E604AED81E}\\InprocServer32", 0, (LPCTSTR)-1},
    {L
"CLSID\\{586CDC7B-09F1-4f44-A110-F0E604AED81E}\\InprocServer32", L"ThreadingModel", L"Both"},
    {L
"CLSID\\{586CDC7B-09F1-4f44-A110-F0E604AED81E}\\ProgID", 0, L"BeginningCOM.1"},
    {L
"BeginningCOM.1", 0, L"COM ProgID sample"},
    {L
"BeginningCOM.1\\CLSID", 0, L"{586CDC7B-09F1-4f44-A110-F0E604AED81E}"}
};

可以使用ProgIDFromCLSID函数,将CLSID转换为ProgID;使用CLSIDFromProgID将ProgID转换为CLSID,具体使用见MSDN。

COM有关的注册表内容:http://msdn.microsoft.com/en-us/library/ms678477(VS.85).aspx

源文件下载:BeginningCOM3.zip