IE ATL编程菜鸟请教 有个微软的例程 不知道如何修改

MmMVP 2007-12-22 04:46:40
http://download.microsoft.com/download/6/8/3/683DB9FE-8D61-4A3C-B7B8-3169FF70AE9F/atlbrowser.exe(可执行压缩包)
一个ATL浏览器代码
我想修改成不注册任何uuid就能运行的版本 不知道如何下手 希望大侠不吝赐教!
...全文
265 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
pzhuyy 2007-12-25
  • 打赏
  • 举报
回复
楼主是个强人,学习了.
MmMVP 2007-12-25
  • 打赏
  • 举报
回复
谢谢楼上各位的发言!
我只是需要从IWebBrowser2继承做一个类,同时实现以下接口:
public IOleClientSite,
public IOleCommandTarget,
public IOleInPlaceSite,
public IDocHostShowUI,
public IServiceProvider
因为MS的例程是用了自己的函数做接口 所以生成了UUID
我不需要那个接口,想改成类内实现的,而我不熟悉ATL部分的编程,所以请教大家。。。
我的意思是,想由com版本的代码,改为非com版本来实现
不知道现在大家明白我的意思了么。。。
tfq2002 2007-12-25
  • 打赏
  • 举报
回复
要实现com的功能,又不注册uuid
那干脆直接用浏览器控件酸了
oyljerry 2007-12-25
  • 打赏
  • 举报
回复
CComObjectRootEx
CComCoClass
在ATL,这是标准COM 对象需要继承的模板类...
r_swordsman 2007-12-25
  • 打赏
  • 举报
回复
lz是向直接从IWebBrowser2单继承...其他接口一个都不继承..对吧?
jameshooo 2007-12-24
  • 打赏
  • 举报
回复
没有GUID就不可能有COM组件,如果你不在注册表中注册你的组件,COM将永远找不到你的组件来调用。楼主实在是钻牛角尖。
yxz_lp 2007-12-24
  • 打赏
  • 举报
回复
真是死心眼,你再看看还有IID_IAtlBrCon调用没

#include "stdafx.h"
#include "resource.h"
#include "initguid.h"
#include "AtlBrowser.h"

#include "AtlBrowser_i.c"
#include "AtlBrCon.h"


LONG CExeModule::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}
//
CExeModule _Module;
//
//BEGIN_OBJECT_MAP(ObjectMap)
// OBJECT_ENTRY(CLSID_AtlBrCon, CAtlBrCon)
//END_OBJECT_MAP()
//
//
//LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
//{
// while (*p1 != NULL)
// {
// LPCTSTR p = p2;
// while (*p != NULL)
// {
// if (*p1 == *p++)
// return p1+1;
// }
// p1++;
// }
// return NULL;
//}

/////////////////////////////////////////////////////////////////////////////
//
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
HRESULT hRes = CoInitialize(NULL);

// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);

////_ASSERTE(SUCCEEDED(hRes));
//_Module.Init(ObjectMap, hInstance);
//_Module.dwThreadID = GetCurrentThreadId();
//TCHAR szTokens[] = _T("-/");

//int nRet = 0;
//BOOL bRun = TRUE;
//LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
//while (lpszToken != NULL)
//{
// if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, FALSE);
// nRet = _Module.UnregisterServer();
// bRun = FALSE;
// break;
// }
// if (lstrcmpi(lpszToken, _T("RegServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, TRUE);
// nRet = _Module.RegisterServer(TRUE);
// bRun = FALSE;
// break;
// }
// lpszToken = FindOneOf(lpszToken, szTokens);
//}

//if (bRun)
//{
//hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
//_ASSERTE(SUCCEEDED(hRes));

// // Create the Atl Browser Container
//CComPtr<IAtlBrCon> pApp;
//CoCreateInstance(CLSID_AtlBrCon, NULL, CLSCTX_INPROC_SERVER, IID_IAtlBrCon,
// (void**)&pApp);
//新加的
//CComPtr<IAtlBrCon> pApp;
CComPtr<CComObject<CAtlBrCon>> pApp;
CComObject<CAtlBrCon>::CreateInstance(&pApp);
//atlbr->QueryInterface(IID_IAtlBrCon,(void**)&pApp);
//end
if (pApp)
{
pApp->Run();

long hwnd;
HWND hwndApp;
pApp->GetHwnd(&hwnd);
hwndApp = (HWND)hwnd;

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
HACCEL hAccel = LoadAccelerators(_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDR_ACCELERATOR));
_ASSERT(hAccel);
if (!::TranslateAccelerator(hwndApp, hAccel, &msg))
{
// Avoid the beep when in the combo box
if (msg.wParam != VK_RETURN && msg.wParam != VK_TAB)
::TranslateMessage(&msg);

//
// If we get a keydown message, we must get send the message
// to the container window so that the message can be routed to
// the correct window. This is necessary so that the container
// window can call TranslateAccelerator on the in-place active
// object and so that VK_RETURN and VK_TAB messages received from
// the combobox in the toolbar will be processed correctly.
//
if (msg.message == WM_KEYDOWN)
::SendMessage(hwndApp, msg.message, msg.wParam, msg.lParam);

::DispatchMessage(&msg);
}
}
}

//_Module.RevokeClassObjects();
//}

CoUninitialize();

return 0;
}

MmMVP 2007-12-24
  • 打赏
  • 举报
回复
谢谢楼上不厌其烦地解答!
你的代码虽然使AtlBrowser.cpp中没有调用了。可是AtlBrCon这个类的定义里AtlBrCon.cpp依然有调用。。。
class ATL_NO_VTABLE CAtlBrCon :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAtlBrCon, &CLSID_AtlBrCon>,---------》这里有
public CWindowImpl<CAtlBrCon>,
public IDispatchImpl<IAtlBrCon, &IID_IAtlBrCon, &LIBID_ATLBROWSERLib>,----》这里也有
public IOleClientSite,
public IOleInPlaceSite,
public IDocHostUIHandler,
public IDocHostShowUI
MmMVP 2007-12-23
  • 打赏
  • 举报
回复
谢谢楼上朋友!
atlbr->QueryInterface(IID_IAtlBrCon,(void**)&pApp);

IID_IAtlBrCon
这个clsid还是被调用了
如果我不想使用哪个tlb,而换成自己的函数,可以吗?
还有
class ATL_NO_VTABLE CAtlBrCon : 
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CAtlBrCon, &CLSID_AtlBrCon>,
public CWindowImpl<CAtlBrCon>,
public IDispatchImpl<IAtlBrCon, &IID_IAtlBrCon, &LIBID_ATLBROWSERLib>,
public IOleClientSite,
public IOleInPlaceSite,
public IDocHostUIHandler,
public IDocHostShowUI


这个类定义处的IID_IAtlBrCon CLSID_AtlBrCon,如何删除呢?
yxz_lp 2007-12-23
  • 打赏
  • 举报
回复
更改后的代码


#include "stdafx.h"
#include "resource.h"
#include "initguid.h"
#include "AtlBrowser.h"

#include "AtlBrowser_i.c"
#include "AtlBrCon.h"


LONG CExeModule::Unlock()
{
LONG l = CComModule::Unlock();
if (l == 0)
{
#if _WIN32_WINNT >= 0x0400
if (CoSuspendClassObjects() == S_OK)
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#else
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
#endif
}
return l;
}

CExeModule _Module;

BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_AtlBrCon, CAtlBrCon)
END_OBJECT_MAP()


LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
{
while (*p1 != NULL)
{
LPCTSTR p = p2;
while (*p != NULL)
{
if (*p1 == *p++)
return p1+1;
}
p1++;
}
return NULL;
}

/////////////////////////////////////////////////////////////////////////////
//
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
HRESULT hRes = CoInitialize(NULL);

// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);

_ASSERTE(SUCCEEDED(hRes));
_Module.Init(ObjectMap, hInstance);
_Module.dwThreadID = GetCurrentThreadId();
TCHAR szTokens[] = _T("-/");

int nRet = 0;
BOOL bRun = TRUE;
LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
//while (lpszToken != NULL)
//{
// if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, FALSE);
// nRet = _Module.UnregisterServer();
// bRun = FALSE;
// break;
// }
// if (lstrcmpi(lpszToken, _T("RegServer"))==0)
// {
// _Module.UpdateRegistryFromResource(IDR_AtlBrowser, TRUE);
// nRet = _Module.RegisterServer(TRUE);
// bRun = FALSE;
// break;
// }
// lpszToken = FindOneOf(lpszToken, szTokens);
//}

if (bRun)
{
//hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE);
//_ASSERTE(SUCCEEDED(hRes));

// // Create the Atl Browser Container
//CComPtr<IAtlBrCon> pApp;
//CoCreateInstance(CLSID_AtlBrCon, NULL, CLSCTX_INPROC_SERVER, IID_IAtlBrCon,
// (void**)&pApp);
//新加的
CComPtr<IAtlBrCon> pApp;
CComObject<CAtlBrCon>* atlbr;
CComObject<CAtlBrCon>::CreateInstance(&atlbr);
atlbr->QueryInterface(IID_IAtlBrCon,(void**)&pApp);
//end
if (pApp)
{
pApp->Run();

long hwnd;
HWND hwndApp;
pApp->GetHwnd(&hwnd);
hwndApp = (HWND)hwnd;

MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
HACCEL hAccel = LoadAccelerators(_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDR_ACCELERATOR));
_ASSERT(hAccel);
if (!::TranslateAccelerator(hwndApp, hAccel, &msg))
{
// Avoid the beep when in the combo box
if (msg.wParam != VK_RETURN && msg.wParam != VK_TAB)
::TranslateMessage(&msg);

//
// If we get a keydown message, we must get send the message
// to the container window so that the message can be routed to
// the correct window. This is necessary so that the container
// window can call TranslateAccelerator on the in-place active
// object and so that VK_RETURN and VK_TAB messages received from
// the combobox in the toolbar will be processed correctly.
//
if (msg.message == WM_KEYDOWN)
::SendMessage(hwndApp, msg.message, msg.wParam, msg.lParam);

::DispatchMessage(&msg);
}
}
}

//_Module.RevokeClassObjects();
}

CoUninitialize();

return nRet;
}


在AtlBrowser.cpp文件中

#include "stdafx.h"
#include "AtlBrowser.h"
#include "AtlBrCon.h"
#include "ExDispID.h"
#include "WBCmdGroup.h"
#include "DispIds.h"
//#include <strstrea.h>//如果编译通不过就注释掉,改成下面两行代码,我这里通不过。。。
#include <strstream>
using namespace std;
MmMVP 2007-12-23
  • 打赏
  • 举报
回复
up
菜鸟问题 不要见笑。。
MmMVP 2007-12-22
  • 打赏
  • 举报
回复
谢谢帮顶的朋友以及楼上的宝贵意见!
我对atl编程不熟悉,我所说的“不用注册”是指不生成CLSID就能执行的com。
微软的例子生成了一个CLSID,然后调用CComCoClass以及IDispatchImpl这两个接口。
我不知道可不可以换成别的接口 不需要把我的类的CLSID作为参数的。也不需要给我的类分配clsid
因为我的类是对IWebBrowser2的封装。。
sjdev 2007-12-22
  • 打赏
  • 举报
回复
我没有下载代码来看,先发表一下“臆见”:

不用注册,考虑两种
1:自注册,这种情况没什么说的啦,在运行这个exe时,会自动注册。
2:手动注册,那只好找一个可执行程序,让他代劳,在这个可执行程序中注册那些需要手动注册的组件,不过不推荐。

另:一个疑问
你所说,“不用注册”是指不允许它注册,还是指不用手动去注册?
alphagm 2007-12-22
  • 打赏
  • 举报
回复
沙发帮顶!
中文名: 深入解析ATL(第2版) 原名: ATL Internals, 2nd Edition Working with ATL 8 别名: ATL 作者: (美)塔瓦瑞斯译者: 赖仪灵 曹雨田 资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社书号: 9787121049859发行时间: 2007年11月01日 地区: 大陆 语言: 简体中文 简介: 编辑推荐 ATL的发明人Jim Springfield亲自作序推荐。   四位顶尖的Windows编程专家倾力合作,绝对经典再现。   COM、ATL开发人员的必备宝典。   深入分析ATL实现COM内幕细节,展示COM应用中的各类漂亮技巧。   ATL的经典指南现已更新到ATL 8和VisuaI Studio 2005:   四位顶尖的Windows编程专家在本书中系统地揭示了ATL的内部工作原理,他们解释了ATL是 如何工作的,以及为什么要以这样的方式工作。通过本书,客户端开发人员可以掌握ATL中的窗口、COM控件、MFC集成、Web服务代理生成等资源。服务端编程人员可以应用ATL的全COM服务器和对象服务、高吞吐量、高并发Web应用程序和服务的广泛支持。每个Windows开发人员都将从本书中学到强大的方法来增加应用程序的灵活性、减少负载、最大化程序的透明度和可控性。   ·通过图表、示例代码和ATL的内部实现代码来揭密ATL的内部原理。   ·遍历向导以简化在普通应用程序中的ATL开发。   ·掌握C++、COM和ATL中的字符串使用技巧。   ·利用ATL的智能类型:CComPtr、CComQIPtr、CComBSTR和CComVariant。   ·理解并正确实现IUnknown。   ·创建能从COM服务器中暴露COM对象的粘合代码。   ·使用Canned Interface实现来支持对象的永久性、COM集合、枚举器和连接点。   ·使用ATL窗口类和控件建立独立的应用程序和UI组件。   ·使用ATL Servet开发可以运行在微软IIS上的Web应用程序。 虽然.NET系统从1998年才开始其发展进程。但它已经使很多开发人员的编程发生了革命性的变化,并在未来几年将持续得到改进。但是,COM编程(和 ATL)也依然非常有活力,对Microsoft内外的很多开发人员都非常重要。本书的第2版,与第1版一样,提供了您所需要的信息,使我们在这些技术上的投资也将获得最大的回报。                        ——Jim Springfield,ATL发明人 虽然ATL比较精深,但是这本书的讲解非常通俗易懂,语言比较简练,条理非常清楚。即使在读完这本书之后,它仍然可以作为参考书指导我们的开发和学习工作。我想,这就是好书的价值所在吧。            ——潘爱民,经典畅销书《深入解析Windows操作系统,第4版》译者 内容简介 本书主要介绍了ATL技术的原理、内部实现和应用技巧,由当今4 位顶尖的 Windows技术专家联合撰写。全书内容丰富,深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、理解并正确实现IUnknown、充分利用ATL提供的Smart Types、撰写能够暴露COM服务器上COM对象的粘合代码、利用Canned Interface实现来支持对象持久化/COM群集/枚举、利用ATL Windows类建构独立的应用程序和UI组件等的技术内容。本书适合于广大Windows开发人员阅读参考,是ATL开发人员的必备权威参考书籍。 作者简介 Christopher Tavares,目前在微软工作,是模式与实践方面的专家。有着超过25年的编程经验,涉及的平台从Sinclair ZX-81到多CPU信号处理硬件。 目录: 第2版序 第1版序 前言 致谢 关于作者 联系博文视点 第1章 你好,ATL 1.1 什么是ATL 1.2 创建COM服务器 1.3 插入COM类 1.4 添加属性和方法 1.5 实现附加接口 1.6 脚本支持 1.7 添加永久性 1.8 添加和激发事件 1.9 使用窗口 1.10 COM控件 1.11 容纳控件 1.12 ATL Server Web项目 1.13 总结 第2章 字符串和文本 2.1 字符串数据类型、转换类和辅助函数 2.2 智能BSTR类CComBSTR 2.3 CComBSTR类 2.4 CString类 2.5 总结 第3章 ATL智能类型 3.1 智能VARIANT类CComVariant 3.2 智能SAFEARRAY类CComSafeArray 3.3 智能指针类CComPtr和CComQIPtr 3.4 智能指针类CAutoPtr和CAutoVectorPtr 3.5 ATL内存管理器 3.6 总结 第4章 ATL中的对象 4.1 实现IUnknown 4.2 ATL的层次 4.3 线程模型支持 4.4 IUnknow核心 4.5 我们的类 4.6 CComObject以及其他 4.7 ATL创建者 4.8 调试 4.9 总结 第5章 COM服务器 5.1 回顾COM服务器 5.2 对象映射表和CAtlModule类 5.3 对象映射表 5.4 对象映射类要求的方法 5.5 CAtlModule类 5.6 重游CComCoClass 5.7 ATL与C运行时库 5.8 总结 第6章 接口映射表 6.1 回顾:COM的实体身份 6.2 表驱动的QueryInterface 6.3 多重继承 6.4 Tear-off接口 6.5 聚合:外部控制对象 6.6 接口映射表链 6.7 尽管说“不” 6.8 调试 6.9 扩展性 6.10 总结 第7章 ATL中的永久性 7.1 回顾COM的永久性 7.2 ATL的永久性实现类 7.3 属性映射表 7.4 永久性实现 7.5 其他永久性实现 7.6 使用永久性添加“按值列集”的语义 7.7 总结 第8章 集合和枚举器 8.1 COM集合和枚举接口 8.2 枚举数组 8.3 枚举标准的C++集合 8.4 集合 8.5 ATL数据类型的标准C++集合 8.6 ATL集合 8.7 对象模型 8.8 总结 第9章 连接点 9.1 回顾连接点 9.2 创建基于ATL的可连接对象 9.3 创建一个接收事件的对象 9.4 它是怎么工作的:杂乱的实现细节 9.5 总结 第10章 窗口 10.1 Windows应用程序的结构 10.2 CWindow 10.3 CWindowImpl 10.4 CDialogImpl 10.5 Windows控件包装类 10.6 CContainedWindow 10.7 总结 第11章 ActiveX控件 11.1 回顾ActiveX控件 11.2 BullsEye控件需求 11.3 使用ATL向导创建初始的控件 11.4 初始的BullsEye源文件 11.5 逐步开发BullsEye控件 11.6 总结 第12章 控件包容 12.1 控件是如何被包容的 12.2 基本的控件包容 12.3 在对话框中容纳控件 12.4 复合控件 12.5 HTML控件 12.6 ATL控件包容的限制 12.7 总结 第13章 你好,ATL Server:一个新型的C++ Web平台 13.1 微软Web平台(因特网信息服务) 13.2 可能是可以运行的最简单ISAPI扩展 13.3 封装ISAPI 13.4 ATL Server 13.5 ATL Server中的Web服务 13.6 总结 第14章 ATL Server内幕 14.1 ATL Server中的ISAPI实现 14.2 服务器响应文件 14.3 请求处理程序示例 14.4 输入处理 14.5 会话管理 14.6 数据缓存 14.7 总结 附录A 实例展示C++模板 A.1 模板的必要性 A.2 模板基础 A.3 不同类型的多态 A.4 函数模板 A.5 成员函数模板 A.6 总结 附录B ATL头文件 附录C 移植到ATL 8 C.1 字符串、字符集和转换 C.2 与MFC共享的类 C.3 实现COM服务器 C.4 ActiveX控件和控件容纳 C.5 ATL_MIN_CRT变化 C.6 总结 附录D 属性化ATL D.1 ATL Attributes的基础 D.2 属性化ATL的未来 D.3 总结 索引
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL中——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象中的元

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧