65.9K
CodeProject 正在变化。 阅读更多。
Home

统计 OLE 自动化实例的数量

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2015年3月21日

CPOL

2分钟阅读

viewsIcon

10304

downloadIcon

142

本示例演示了如何统计在特定时间运行的 OLE 自动化对象数量。

引言

这解释了在特定时间 OLE 自动化运行实例的工作原理。

背景

在大量 Google 搜索后,我找到了 C# 中的一些代码。完整的代码可以在 这里 找到。

逻辑很简单,如果自动化类被设置为运行,它们首先必须在全局列表中注册,获取活动对象,然后销毁这些对象。

Using the Code

C# 代码非常简单易懂。我的主要目标是用 C++ 编写代码。

首先,请查看 C# 代码。我创建了一个 C++ 类,该类将在列表控件中显示所有正在运行的实例。希望这能帮助那些正在努力奋斗的人。

首先,获取我们想要统计实例数量的对象数量。我们已经将 OLE 类的名称放在数组中,例如,<string progIds[]>

string progIds[] = {Excel.Application, Word.Application, Outlook.Application};

IRunningObjectTable 获取运行对象表,其中包含所有已注册的全局 OLE 对象。

IRunningObjectTable* pRunningObjects;
GetRunningObjectTable (NULL, &pRunningObjects);

这基本上是全局访问对象。有关更多详细信息,请参阅 MSDN。

IEnumMoniker 对象中枚举正在运行的全局对象。

IEnumMoniker* pEnumObjects;
pRunningObjects->EnumRunning (&pEnumObjects);

我们现在几乎完成了。

运行一个循环,从枚举的对象中获取单个元素,直到返回 SUCCESS,即 0

为了进一步推进,我们可以将名称与之前传递的 string 数组进行比较,使用 <LPOLESTR lpdisplayName[]>

可以表示为

IMoniker* pIndividualObject;
ULONG lRetuned;
while (pEnumObjects->Next(1, &pIndividualObject, &lRetuned) == 0)
{
   IBindCtx* pBindObj;
   CreateBindCtx (0, &pBindObj);

   if (pBindObj == NULL)  continue;
 
   LPOLESTR lpdisplayName;
   pIndividualObject->GetDisplayName (pBindObj, NULL, &lpdisplayName);
}

最后但并非最不重要的一点,不要忘记以完全相同的递减顺序释放所有已初始化或使用的自动化类,最后使用的类应首先释放。

例如,在循环结束之前

pBindObj->Release ();

pIndividualObject->Release ();

同样适用于 pEnumObjects,然后是程序结束前的 pRunningObjects

关注点

我的动机是用最少的资源来简化工作。希望我完成了我的目标。

历史

自动化类是编程文化的重要组成部分,因此维护它们并在不需要时释放它们是一项重要的任务。但很多时候,我们作为开发人员,都会以某种方式失败。

因此,为了验证我们是否完成了任务,这里有一个示例。可以进一步扩展到使用 GetActiveObjectRegisterActiveObjectRevokeActiveObject。这些将在下一篇文章中扩展。

在此期间,祝您编码愉快。

© . All rights reserved.