代码改变世界

com 名字对象(3)使用IMoniker

2011-08-01 21:16  Clingingboy  阅读(1959)  评论(0编辑  收藏  举报

 

一.名字对象比较

Hash和IsEqual方法

IMoniker* moniker2=NULL;
CreateFileMoniker(OLESTR("F:\\test.xlsx"),&moniker2);
DWORD dw;
moniker2->Hash(&dw);
IMoniker* moniker3=NULL;
CreateFileMoniker(OLESTR("F:\\test2.xlsx"),&moniker3);
DWORD dw2;
moniker3->Hash(&dw2);
HRESULT hr= moniker2->IsEqual(moniker3);

IsRunning说明对象是否在运行,GetTimeOfLastChange获取对象最后一次修改时间

IBindCtx* bindCtx=NULL;
CreateBindCtx(0,&bindCtx);
FILETIME ft;
moniker3->GetTimeOfLastChange(bindCtx,NULL,&ft);
hr=moniker3->IsRunning(bindCtx,NULL,NULL);

二.管理复合名字对象

1.Inverse返回名字对象的逆名字对象

IMoniker* moniker2=NULL;
CreateFileMoniker(OLESTR("F:\\test.xlsx"),&moniker2);
IMoniker* moniker3=NULL;
CreateItemMoniker(OLESTR("!"),OLESTR("Sheet1"),&moniker3);
IMoniker* moniker4=NULL;
CreateGenericComposite(moniker2,moniker3,&moniker4);
LPOLESTR str;
IBindCtx* bindCtx=NULL;
CreateBindCtx(0,&bindCtx);
moniker4->GetDisplayName(bindCtx,NULL,&str);
IMoniker* moniker5=NULL;
moniker4->Inverse(&moniker5);
LPOLESTR str2;
moniker5->GetDisplayName(bindCtx,NULL,&str2);

原文件名字对象:F:\test.xlsx!Sheet1
逆名字对象:\..\..

2.IsSystemMoniker返回名字对象的类型

DWORD monikerType;
IMoniker* moniker2=NULL;
CreateFileMoniker(OLESTR("F:\\test.xlsx"),&moniker2);
moniker2->IsSystemMoniker(&monikerType);

 

typedef 
enum tagMKSYS
    {    MKSYS_NONE    = 0,
    MKSYS_GENERICCOMPOSITE    = 1,
    MKSYS_FILEMONIKER    = 2,
    MKSYS_ANTIMONIKER    = 3,
    MKSYS_ITEMMONIKER    = 4,
    MKSYS_POINTERMONIKER    = 5,
    MKSYS_CLASSMONIKER    = 7,
    MKSYS_OBJREFMONIKER    = 8,
    MKSYS_SESSIONMONIKER    = 9,
    MKSYS_LUAMONIKER    = 10
    }     MKSYS;

三.反-名字对象(CreateAntiMoniker)

在创建自定义名字对象时菜会用到这种名字对象.暂时不深究

四.三个处理FILETIME的函数

HRESULT CoFileTimeNow(
  FILETIME * lpFileTime
);

BOOL CoDosDateTimeToFileTime(
  WORD nDosDate,
  WORD nDosTime,
  FILETIME * lpFileTime
);

BOOL CoFileTimeToDosDateTime(
  FILETIME * lpFileTime,
  LPWORD lpDosDate,
  LPWORD lpDosTime
);