COM
文章平均质量分 83
leehong2005
这个作者很懒,什么都没留下…
展开
-
DeskBand实现之——实现声明
本文列出Desk Band的具体实现细节与代码。我这个Desk Band都是用SDK直接实现,没有用ATL来实现,用ATL也是可以的。用SDK可能麻烦一点。 SdkDeskBandObject.h文件说明:SdkDeskBandObject这个类定义了Band对象的接口。#ifdef __cplusplus#ifndef _SDKDESKBANDD原创 2013-02-25 11:40:05 · 4097 阅读 · 0 评论 -
Windows文件检索之——接口设计
这一节我们讲文件检索,主要讲一讲它用到了哪些COM接口和Shell相关知识。这里,我们重点讲一讲它的本质,至于如何利用设计模式的东西去包装,用没用线程等,这里就不用讲了。我们需要的是关注本质。其实对于熟悉Shell的人来说,Search这一部分是比较简单的。我们很幸运,由于之前做的一个项目是仅仅是运行在Windows 7之上的,所以我们这个检索模块可以不用支持Windows 7以下的OS,原创 2013-02-26 13:29:21 · 2418 阅读 · 1 评论 -
第五部分:IDropTarget实现
这一节我们讲如何来实现一个自己的Drop Target,我们需要实现IDropTarget接口。1.如何成为一个"Drop Target"为了使窗体能接收拖放的数据,窗口必须注册为drop目标,调用OLE API RegisterDragDrop来完成这件事情,函数原型如下:WINOLEAPI RegisterDragDrop( HWND hwnd,原创 2013-02-26 11:49:30 · 6402 阅读 · 4 评论 -
Windows文件检索之——查询范围
对于检索范围来说,也是比较简单的,根据第一节,我们知道,ISearcherFolderFactory提供了一个方法SetScope,就是让用户传一个IShellItemArray的指针进去。所以,我们主要的工作就是如何来创建IShellItemArray接口指针。1.如何创建IShellItemArrayShell API提供了一个方法,SHCreateShellItemArrayFrom原创 2013-02-26 13:51:41 · 3057 阅读 · 1 评论 -
第四部分:IDropSource实现
上一节,我们讲了如何实现一个自己的IDataObject接口,在开始这一部分之前,我还想再说一下,IDataObject有一个接口------ EnumFormatEtc,这个接口用来枚举当前data object所支持的数据格式,它相当重要。在上一节中,我们给出了它的一个实现,它内部本质是用API SHCreateStdEnumFmtEtc来实现的,这里再来看一看它的实现:STDMETHOD原创 2013-02-25 14:59:47 · 5418 阅读 · 0 评论 -
第三部分:IDataObject实现
第二部分我们介绍了OLE数据传输的相关知识,这一节主要讲怎么实现一个IDataObject接口。然后再给出一个例子。首先我们要明白,IDataObject是一个COM接口,我们就必须得创建一个类,实现这个接口的每一个方法,包括它的基类的方法。1. SdkDataObject.h 头文件: #ifdef __cplusplus#ifndef _SDKDATAOBJECT_H原创 2013-02-25 14:53:08 · 9284 阅读 · 2 评论 -
第二部分:OLE 数据传送(Data Transfer)
这一部分讲一讲OLE数据传输相关知识,多数来自于MSDN和网上其同志们的观点,加以总结而成。 COM接口提供了一种用于在不同的应用程序中交换数据的机制,这就是我们要讲的数据对象,对应的COM接口就是IDataObject。 大多数平台,包括Windows,都定义了一个用于在应用程序之间传输数据的标准协议,基于一系列的剪切板的函数。应用程序使用这些函数可以共享数据,即使它们原创 2013-02-25 14:44:23 · 4059 阅读 · 1 评论 -
第一部分:OLE Drag&Drop 介绍
1.基本概念 拖放,是指用鼠标拖动的方法,在不同程序的窗口之间、同一程序的不同窗口之间或同一程序同一窗体的不同控件之间,进行移动、复制、粘贴数据等操作的技术。拖放操作是依靠操作系统来完成的,被拖动的对象首先向操作系统注册一种它所使用数据的格式,并且按照这种格式来提供数据,拖放结束时,目标窗口提取出数据,并根据提取的数据生成相应的对象。 拖放方式有两种,一种是OLE拖放(原创 2013-02-25 14:41:11 · 4381 阅读 · 0 评论 -
DeskBand实现之——对象介绍
最近的项目上用到了Desk Band这种东西,我也是第一次做这个,做完后感觉收获很多,本文就讲一个如果实现一个自定义的Desk Band COM对象。 1. Band对象介绍Windows的区(Bands)对象有三种:浏览栏(Explorer Bar)区对象,工具栏(Tools Bands)区对象,和桌面区对象(Desk Bands)。本文主要讲一下桌面区对象的实现原创 2013-02-25 11:36:37 · 6972 阅读 · 0 评论 -
DeskBand实现之——遇到的问题2
1. 最近又发现一个问题,相当严重,但重现机率相当小,最后通过打LOG,调了半天,终于找到原因。现象如下:把Desk Band关闭,再重新打开就会把explorer弄挂掉。一定要多试几次才可能出现。原因是什么呢?Desk Band出来是会创建一个窗体的,同时也会注册一个全局类,调用RegisterClass函数就行。RegisterClass会指定一个消息处理函数地址,也就是一原创 2013-02-25 12:02:08 · 1712 阅读 · 0 评论 -
DeskBand实现之——遇到的问题
在做DeskBand过程中,遇到了一些问题,这些问题说大可大,说小可小,不是三下两下就解决了,还是花了一些时间来解决。1. 会导致explorer.exe挂掉 原因: 这个问题导致是由于当前DeskBand的DLL的引用计数不正确导致的。系统每隔一段时间就会去调用 DllCanUnloadNow函数来检测当前DLL是否可以被系统卸载。系统大约每隔15分钟会检原创 2013-02-25 12:00:39 · 3430 阅读 · 1 评论 -
DeskBand实现之——注册与反注册
有了COM对象后,必须对浏览栏的CLSID进行注册。另外如果要与IE或资源管理器协调运行,还必须进行的恰当的组件种类(CATID_DeskBand)注册。这个工作由DllRegisterServer处理。实现代码如下:注册表中的结构如下图:1. 注册STDAPI DllRegisterServer(){ BOOL isSuccess = S原创 2013-02-25 11:56:42 · 3186 阅读 · 1 评论 -
DeskBand实现之——四个函数
对于一个DeskBand来说,它应该是一个DLL,也是一个COM对象,它是由explorer来调用的。对于DLL来说,它有几个函数,相当重要,本文对这几个函数作一个简单说明。 1,DllMain 2,DllGetClassObject 3,DllCanUnloadNow 4,DllRegisterServer 5,DllUnre原创 2013-02-25 11:52:48 · 2259 阅读 · 0 评论 -
DeskBand实现之——代码实现
SdkDeskBandObject.cpp文件说明:这是Desk Band最核心的类,它主要完成Band对象的创建,销毁,窗体创建,关闭,显示等。当创建空上对象时,一定要把当前DLL的引用计数加1,对象析构时,DLL的引用计数要减1。#define _DEFINE_GLOBAL_VARIABLES#include "SdkDeskBandDef.h"#include原创 2013-02-25 11:50:21 · 5965 阅读 · 1 评论 -
Windows文件检索之——查询条件
这一节讲如何实现查询条件。我们把查询条件封装成了一个类,SdkQueryCondition,它的本质是对ICondition这个COM接口进行的封装。1.SdkQueryCondition接口下面列出SdkQueryCondition类的公共接口。HRESULT GetCondition(ICondition **ppc);HRESULT SetCondition(LPCWS原创 2013-02-26 13:46:09 · 2051 阅读 · 0 评论