实现应用程序中的并行组件共享(二)

当将现有组件修改为并行时,正是将它的激活方式改为使用相对路径和隔离全局状态。重要的是给它一个新的 CLSID、ProgId,并且重命名该文件,然后将这个 CLSID、ProgId 以及新文件名用于后来的并行组件。这样做可以避免在并行版本上再注册该组件的非并行版本而引起的冲突。并行组件和他们以前的非并行版本不向后兼容。

状态存储

对于注册表中存储的状态(设置),需要将状态私有化为该应用程序运行的上下文。可以使用 GetModuleFileName() 函数设置一个虚拟根。应对 HKLM 和 HKCU 分支执行该操作。

必须在每个版本的基础上完成注册设置,以获得注册表的隔离。注册表项是组件保存其状态的通用方法。因为在机器中可能存在组件的不同版本,因此重要的是当重新编译时,能尽可能容易地找到您的表项的版本。获得一套优良的头文件和有用的 API,会使得这件事情变得简单。

用下列命名约定在表项中存储注册状态:

HKCU\MyCompany\MyComponent\VersionXXXX\

例如,假定一个称为 EnableSuperCoolFeature 的配置设置有真或假的值。在注册表中存储该信息的传统方式为:

HKEY_CurrentUser\Software\MyCompany\MyComponent\

EnableSuperCoolFeature = TRUE

在并行共享情况下,应当用如下方式存储它:

HKEY_CurrentUser\Software\MyCompany\MyComponent\Version01.01

EnableSuperCoolFeature = TRUE

另外,如果确定需要隔离每个应用程序,可以使用

HKCU\MyCompany\MyComponent\VersionXXYY\SomeApplication\\

其中“SomeApplication”是 GetModuleFileName 的返回值。这样做使组件能够隔离它的设置,该设置只针对当前正在运行的应用程序。

理想的情况下,应支持永久模型,以使应用程序担负起保持用户状态的责任并且不更改注册表。应用程序不必直接与组件的注册表项接触。作为代替,组件应提供一些 API,以保存或恢复与并行一致的设置。

对于全局状态下的交互,存储在除注册表以外的其他位置的设置,应以并行方式存储。这类存储包含:

被保护的存储 (pstore)

WinInet 高速缓存

Microsoft SQL Server™ 或 Microsoft Jet 数据库

安装并行组件

安装之前

安装并行组件之前,必须确定在您的操作系统中是否支持它们。下列代码检测并行共享是否可用。如果不可用,组件必须安装在系统目录中。

BOOL bPlatformSupportsSideBySide(void)

{

OSVERSIONINFOEX osviex ;

osviex.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);

// 若平台不支持 OSVERSIONINFOEX 结构,就不支持并行

// 在内核中,我们已经使这些修改连在一起

//

if (!GetVersionEx((OSVERSIONINFO *)&osviex))

{

return FALSE ; // 无 DLL 重定向

}

// 然而对于 NT,则 NT4 SP4 支持 OSVERSIONINFOEX 支持,但它不支持 DLL 重定向。

// 若 DLL 重定向出现在将来的 NT4 SP 中,必须更新此代码。

//

if ( (osviex.dwPlatformId == VER_PLATFORM_WIN32_NT) &&

(osviex.dwMajorVersion < 5) )

{

return FALSE ;

}

// 对于其他平台标识,假定具有并行支持

return TRUE ;

}

时间: 2024-11-19 18:59:44

实现应用程序中的并行组件共享(二)的相关文章

实现应用程序中的并行组件共享(一)

摘要:探讨 Microsoft(R) Windows(R) 2000 和 Windows 98 第二版本中并行共享组件的实现(如 Windows 认证规范中讨论的).包括新的并行组件的创建以及使用 DLL/COM 重定向处理相同组件的不同版本之间的不兼容性.包括编写和安装并行组件以及重新打包和测试应用程序的指南. 目录 介绍 一点背景知识 新组件共享策略 比较两种策略 创建新的并行组件 并行组件编写指南 安装并行组件 DLL/COM 重定向 使用 DLL/COM 重定向 介绍 现代操作系统和应用

在jsp程序中使用com组件

js|程序 在jsp程序中使用com组件的机会并不多,jsp也没有直接操作com的函数,但有的工作有时候还必须使用com组件来完成,下面就来说一下具体的操作方法. 在jsp中使用com组件有两种方法:一种是用javascript在客户端来控制(严格说这个应该是html的功能),如:<OBJECT id="myCom" classid="clsid:9D8A2E2F-D38F-CDAC-D0C5-5B3FB2275442" codebase=".com

在jsp程序中使用com组件_JSP编程

在jsp程序中使用com组件的机会并不多,jsp也没有直接操作com的函数,但有的工作有时候还必须使用com组件来完成,下面就来说一下具体的操作方法. 在jsp中使用com组件有两种方法:一种是用javascript在客户端来控制(严格说这个应该是html的功能),如:   <OBJECT id="myCom" classid="clsid:9D8A2E2F-D38F-CDAC-D0C5-5B3FB2275442" codebase=".com/co

Java程序中使用其他组件

一旦要在自己的程序里使用一个预先定义好的类,编译器就必须知道如何找到它.当然,这个类可能就在发出调用的那个相同的源码文件里.如果是那种情况,只需简单地使用这个类即可--即使它直到文件的后面仍未得到定义.Java消除了"向前引用"的问题,所以不要关心这些事情. 但假若那个类位于其他文件里呢?您或许认为编译器应该足够"联盟",可以自行发现它.但实情并非如此.假设我们想使用一个具有特定名称的类,但那个类的定义位于多个文件里.或者更糟,假设我们准备写一个程序,但在创建它的时

自动检测并行Java程序中的错误

当 CPU 进入多核时代之后,并行编程将更加流行,但是编写并行程序更容易 出错.在开发过程中,工程师能注意到同一个程序在单线程运行时是正确的,但 是在多线程时,它会有可能出错.和并行相关的错误的产生原因通常都非常隐晦 ,而且在一次测试中,它们的出现与否具有很强的随机性.由于程序中多个线程 之间可能以任意的方式交错执行,即使一个并行程序正确的运行了成百上千次, 下一次运行仍然可能出现新的错误. Multi-Thread Run-time Analysis Tool 是由 IBM 为多线程 Java

WinForm中的ListBox组件编程

ListBox组件是一个程序设计中经常使用到的组件,在Visual C#和Visual Basic .Net程序中使用这个组件,必须要在程序中导入.Net FrameWork SDK中名称空间System.Windows.Forms,因为在System.Windows.Forms名称空间中定义了这个组件.在ASP.NET的Web页面中,ListBox组件是作为一个服务器端组件的形式出现的,所谓服务器端组件就是这些组件是在服务器端存在的.本文就是来介绍ListBox组件在ASP.NET的Web页面

Java理论与实践: 应该在下一个企业应用程序中使用JMS吗?

最近几年,开发人员可以更广泛地得到企业消息排队(MQ)产品.适当地使 用 MQ 技术经常可以改善应用程序的组织.性能和可伸缩性.Java 消息服务 (Java Message Service (JMS))是集成到 J2EE 中的一部分,它使得 MQ 服务 可以为任何 J2EE 应用程序所用.在本文(也是本专栏系列的第一部分)中, Brian 概述了在 Java 应用程序中使用消息排队的一些好处,并探讨了能够从 MQ 技术中获益最大的问题类型.请在 论坛上(或者通过单击本文顶部或底部的 讨论)同作

在javascript中使用com组件的简单实现方法_javascript技巧

首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: STDMETHODIMP Ctest::test(void) //无输入输出参数  {  // TODO: 在此添加实现代码  MessageBox(NULL,L"test",L"test",MB_OK);  return S_OK;  }  STDMETHODIMP Ctest::test1(BSTR a1) //有一个字符串输入参数  {  // TODO: 在此添加实现代码  Me

在javascript中使用com组件的方法

转载自:  http://dhailin.blog.163.com/blog/static/230738322011128102043880/     首先创建一个COM组件,插入一个双接口Itest,在此接口上实现以下三个方法: [cpp] view plaincopy STDMETHODIMP Ctest::test(void)    //无输入输出参数      {           // TODO: 在此添加实现代码        MessageBox(NULL,L"test"