- 浏览: 1017376 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
前面 两 篇文章分 别 介 绍 了 MFC ActiveX 应 用程序和使用 ATL 开发 ActiveX 的 简单实 例,但 还 有 两个问题 需要解 决 :
1 ) 标记 ActiveX 控件 为 安全的控件 2) 对 控件 进 行 数 字 签 名。本文 将结 合 这两 点 进 行 简单 的介 绍 。
Building a Safe ActiveX Control
如何不想办法将控件标记为安全的,就会在 Web 页面与控件进行交互时出现如下图的警告信息:
下面将分别介绍在 MFC ActiveX 和 ATL 中如何标记一个控件为安全的控件。
要标记一个 MFC ActiveX 控件为安全,可以仿照下面代码修改而得:
#include " stdafx.h "
#include " CardScan.h "
#include " comcat.h "
#include " strsafe.h "
#include " objsafe.h "
CCardScanApp theApp;
const GUID CDECL BASED_CODE _tlid =
{ 0x29959268 , 0x9729 , 0x458E , { 0xA8 , 0x39 , 0xBB , 0x39 , 0x2E , 0xCB , 0x7E , 0x37 } };
const WORD _wVerMajor = 1 ;
const WORD _wVerMinor = 0 ;
const CATID CLSID_SafeItem =
{ 0xB548F3C7 , 0x2135 , 0x4242 ,{ 0x92 , 0x0B , 0xA7 , 0xBD , 0xEE , 0x6D , 0x2B , 0xA3 }};
// { 0x36299202, 0x9ef, 0x4abf,{ 0xad, 0xb9, 0x47, 0xc5, 0x99, 0xdb, 0xe7, 0x78}};
// CCardScanApp::InitInstance - DLL 初始化
BOOL CCardScanApp::InitInstance()
{
BOOL bInit = COleControlModule::InitInstance();
if (bInit)
{
}
return bInit;
}
// CCardScanApp::ExitInstance - DLL 终止
int CCardScanApp::ExitInstance()
{
return COleControlModule::ExitInstance();
}
HRESULT CreateComponentCategory(CATID catid, CHAR * catDescription)
{
ICatRegister * pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, ( void ** ) & pcr);
if (FAILED(hr))
return hr;
// Make sure the HKCR\Component Categories\{..catid }
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english
size_t len;
// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
// The second parameter of StringCchLength is the maximum
// number of characters that may be read into catDescription.
// There must be room for a NULL-terminator. The third parameter
// contains the number of characters excluding the NULL-terminator.
hr = StringCchLength(catDescription, STRSAFE_MAX_CCH, & len);
if (SUCCEEDED(hr))
{
if (len > 127 )
{
len = 127 ;
}
}
else
{
// TODO: Write an error handler;
}
// The second parameter of StringCchCopy is 128 because you need
// room for a NULL-terminator.
hr = StringCchCopy(COLE2T(catinfo.szDescription), len + 1 , catDescription);
// Make sure the description is null terminated.
catinfo.szDescription[len + 1 ] = ' \0 ' ;
hr = pcr -> RegisterCategories( 1 , & catinfo);
pcr -> Release();
return hr;
}
// HRESULT RegisterCLSIDInCategory -
// Register your component categories information
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister * pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, ( void ** ) & pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[ 1 ] ;
rgcatid[ 0 ] = catid;
hr = pcr -> RegisterClassImplCategories(clsid, 1 , rgcatid);
}
if (pcr != NULL)
pcr -> Release();
return hr;
}
// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister * pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, ( void ** ) & pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[ 1 ] ;
rgcatid[ 0 ] = catid;
hr = pcr -> UnRegisterClassImplCategories(clsid, 1 , rgcatid);
}
if (pcr != NULL)
pcr -> Release();
return hr;
}
// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer( void )
{
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
if ( ! AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);
if ( ! COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);
// Mark the control as safe for initializing.
hr = CreateComponentCategory(CATID_SafeForInitializing,
_T( " Controls safely initializable from persistent data! " ));
if (FAILED(hr))
return hr;
hr = RegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// Mark the control as safe for scripting.
hr = CreateComponentCategory(CATID_SafeForScripting,
_T( " Controls safely scriptable! " ));
if (FAILED(hr))
return hr;
hr = RegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForScripting);
if (FAILED(hr))
return hr;
return NOERROR;
}
// DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer( void )
{
HRESULT hr;
AFX_MANAGE_STATE(_afxModuleAddrThis);
// Remove entries from the registry.
hr = UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
hr = UnRegisterCLSIDInCategory(CLSID_SafeItem,
CATID_SafeForScripting);
if (FAILED(hr))
return hr;
if ( ! AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);
if ( ! COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
return NOERROR;
}
这里值得注意的一个地方是 DllUnregisterServer 函数 ,在这段代码中,我是将
hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
这两句代码放在
return ResultFromScode(SELFREG_E_TYPELIB);
if ( ! COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);
这两句代码的前面,如果你查阅 MSDN ,将会发现它上面的顺序和我是相反的,这应该是微软的一个错误代码,如果按照 MSDN 的代码来写,则你使用 regsvr32 -u CardScan.ocx 反注册时会报下面的错误:
调整为我所说的顺序就没问题了。
2 )要标记使用 ATL 写的 ActiveX 控件为安全的控件,这比 MFC 要简单的多,只需要在控件头文件中增加几行代码就可以了:
…
public IObjectSafetyImpl < CTestCtrl, INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA > ,
然后在 COM 映射表中增加一项:
…
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
Building a Signed ActiveX Control
ActiveX 控件是个危险的东西,如果不对其合法性进行数字签名和验证, IE 是会拒绝其安装的。
工具包准备: CABARC.exe, cert2spc.exe, makecab.exe, makecert.exe, signcode.exe( 或新版本中的 signtool) ,以上小工具都可以在 VS 的安装路径下 "Common7"Tools"Bin 找到,或去微软官方网站上下载。
ActiveX
控件的安装过程中,一部分工作就是自注册,这需要控件在
VERSIONINFO
结构中定义
OLESelfRegister
值,你可以对资源文件进行编辑如下
BLOCK " StringFileInfo "
BEGIN
BLOCK " 080403a8 "
BEGIN
VALUE " CompanyName " , " TODO: <公司名> "
VALUE " FileDescription " , " TODO: <文件说明> "
VALUE " FileVersion " , " 1.0.0.1 "
VALUE " InternalName " , " CardScan.ocx "
VALUE " LegalCopyright " , " TODO: (C) <公司名>。保留所有权利。 "
VALUE " OLESelfRegister " , " \0 "
VALUE " OriginalFilename " , " CardScan.ocx "
VALUE " ProductName " , " TODO: <产品名> "
VALUE " ProductVersion " , " 1.0.0.1 "
END
END
BLOCK " VarFileInfo "
BEGIN
VALUE " Translation " , 0x804 , 936
END
END
打包为 CAB 文件
因为 ActiveX 控件要放在网站上供客户下载到本地,因此压缩是必需的。一段典型的 html 代码如下:
CODEBASE ="http://localhost:8080/CardScan.cab"
CLASSID ="CLSID:B548F3C7-2135-4242-920B-A7BDEE6D2BA3" WIDTH =300 HEIGHT =200
/>
CODEBASE 就指明了要下载的压缩包,其中包含了 oxc , dll 控件等所需要的文件。
通常 CAB 文件包含了一个 INF 文件,它用来描述 CAB 文件的所有细节信息,下面举个简单例子,代码如下:
[version]
; version signature ( same for both NT and Win95 ) do not remove
signature = " $CHICAGO$ "
AdvancedINF = 2.0
[Add . Code]
CardScan . ocx = CardScan . ocx
CardScan . inf = CardScan . inf
[CardScan . ocx]
file-win32-x86 = thiscab
clsid = {B548F3C7- 2135 - 4242 -920B-A7BDEE6D2BA3}
FileVersion = 1 , 0 , 0 , 1
RegisterServer = yes
[CardScan . inf]
file = thiscab
; end of INF file
至于打包就不赘述了,详尽的图解过程请看《 如何给 ActiveX数字签名 (Step by Step, Delphi) 》
作者:洞庭散人
出处:http://phinecos.cnblogs.com/
发表评论
-
NotePad++ - 安装和配置C/C++开发插件
2011-11-15 23:00 1847NotePad++ - 安装和配置C/C+ ... -
VC中使用ATL编写控件 【转】
2011-10-21 15:23 2146VC中使用ATL编写控件 作者:邵盛松 2010 ... -
在Windows环境下MongoDB搭建和简单操作【转】
2011-10-21 12:37 1001一,安装mongoDB 1,解 ... -
Mongodb在Windows下安装及配置【转】
2011-10-21 12:35 5911.下载mongodb的windows版本,有32位和64位版 ... -
一篇介绍VC开发OCX的文章[转]
2011-10-20 17:57 1932转自“http://www.cnblogs.com/genga ... -
使你的ActiveX控件执行时不弹出安全性提示 (转载)
2011-10-20 17:56 1218使你的ActiveX控件执行时不弹出安全性提示 2010-0 ... -
VC++ 的MFC 和ATL 及COM 是什么?
2011-10-20 01:12 1027一、什么是MFC 微软基础类(Micro ... -
使用ATL编写一个简单的COM服务器【转】
2011-10-20 01:10 903下载例子代码 本文的对象是COM编程 ... -
使用VC++6.0制作ASP服务器控件简介[转]
2011-10-20 01:10 709用ASP写网页的程序 员,一定对VBSript语句“Set ... -
基于CentOS 5.4搭建nginx+php+spawn-fcgi+mysql
2011-09-01 13:49 1578基于CentOS 5.4搭建nginx+php+sp ... -
解决mrtg的Use of uninitialized value in hash element at /usr/bin/indexmaker line 35
2011-09-01 13:41 2345mrtg的安装过程这里就不再阐述,随便搜索一下。使用ind ... -
用MRTG检测Linux网络性能
2011-09-01 10:49 921随着Linux应用的日益广泛,有大量的网络服务器使用Linux ... -
Linux安装配置maven3.0以及搭建nexus私服
2011-08-30 23:45 1676一、软件准备 1、apache-maven-3.0-b ... -
GraphicsMagick介绍及安装
2011-08-30 23:16 1567作者:Cocowool 来源:博客园 发布时 ... -
Makefile
2011-08-30 22:10 903CC = g++ CFLAG = -Wall -g -w ... -
高位字节优先 低位字节优先
2011-08-24 17:30 1220自第一台计算机诞生, ... -
C++方式的文件操作
2011-08-24 16:05 1853本文主要讨论C++标准I/O库,主要内容为控制台输入输出流 ... -
【JAVA实用工具】JNA-通过它调用C++的方法,比JNI方便很多访问网站需要代理,所以把它COPY出来备忘
2011-08-24 00:33 3220How To Get Started Using JN ... -
Jni中C++和Java的参数传递
2011-08-24 00:04 5166如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对 ... -
aaaaa
2011-08-24 00:04 1037如何使用JNI的一些基本方法和过程在网上多如牛毛,如果你对 ...
相关推荐
本文将详细介绍Vue项目组件化工程开发实践方案,涵盖组件库、文档工程和例子工程三个方面。通过引入vde-cli脚手架,可以快速生成组件库工程目录结构,并且可以自动更新文档工程和例子工程。 一、组件库工程 组件库...
在现代Web开发中,"Web前端工程化与组件化开发实践"已经成为提升开发效率和代码质量的重要手段。本文将深入探讨这两个概念,并结合具体的实践案例,解析如何在JavaScript开发中应用它们。 首先,前端工程化是指通过...
通过学习这个C#组件开发简易教程,你将能够理解组件的基本概念,掌握组件开发的关键技术和实践,为构建高效、可维护的C#应用程序打下坚实基础。在实际开发过程中,不断实践和优化,将使你成为组件开发的专家。
**VC++ 编写COM组件教程** COM(Component Object Model)是微软提出的一...以上内容涵盖了创建和使用COM组件的基本知识,通过学习和实践,你可以熟练地利用VC++开发出高效的COM组件,并在不同的应用程序中灵活使用。
【前端组件化开发实践 -1】 前端开发领域中,组件化是一种重要的开发模式,它能够有效地管理和控制项目复杂性。随着技术的发展,组件化已成为现代前端框架的核心特性,如React和Vue等。美团点评技术团队在实践中也...
对于想要入门Delphi组件开发的初学者来说,了解并掌握相关知识至关重要。组件是Delphi编程的核心元素,它们是可重用的代码模块,封装了特定的功能,可以在界面上直接拖放,极大地提高了开发效率。 首先,我们需要...
ASP组件开发指南主要涵盖了几大核心知识点,这些知识点对于深入理解和构建高效、可复用的ASP应用程序至关重要。本文将详细阐述这些关键概念。...不断探索和实践,将有助于你在ASP组件开发领域积累深厚的专业技能。
《MapGis组件开发手册》是一本专注于MapGis组件技术的权威指南,它深入浅出地阐述了组件开发的基本理论和实践技巧。MapGis作为一款强大的地理信息系统(GIS)软件,其组件化开发模式为用户提供了丰富的自定义功能和...
《Delphi组件开发指南中文版》是一本专为Delphi开发者设计的详尽教程,旨在帮助读者深入理解和掌握在Delphi环境下进行组件开发的核心技术。Delphi是一款强大的面向对象的集成开发环境(IDE),以其高效的编译器和...
基于组件开发(Component-Based Development,简称CBD)是一种现代软件工程方法论,其核心思想在于通过重用预先构建的软件组件来构建新的软件系统,以此提高软件开发效率,降低开发成本,提升软件质量。然而,CBD的...
开发com组件_com开发 vs_vs com组件开发** 在软件开发中,组件(Component)是一种可重用的代码单元,它可以独立于应用程序而存在,并能被多个应用程序共享。COM(Component Object Model)是微软提出的一种组件...
QT生成COM组件并调用COM组件测试工程是一个涉及Qt框架与...通过这样的项目实践,开发者可以深入理解Qt与COM的集成,提高跨平台和跨语言组件开发的能力。同时,这也是对C++编程、对象接口设计和软件集成能力的一次锻炼。
动作组件开发的最佳实践与常见问题解答.docx Unreal Engine开发:动作组件开发_2.动作组件的基础概念.docx Unreal Engine开发:动作组件开发_3.动作组件的类型与功能.docx Unreal Engine开发:动作组
组件开发教程是一个面向初学者的指南,主要涵盖了COM(Component Object Model)技术的各个方面,旨在帮助读者理解并掌握COM组件的开发。COM是微软提出的一种软件组件标准,它允许不同程序之间共享代码和服务,实现...
在iOS应用开发中,组件化是一种重要的架构设计方法,它能有效地提高代码的复用性、可维护性和团队协作效率。本文将探讨iOS App组件化的实践,主要关注以下几个方面: 1. **组件化概念**:组件化是将一个大型的应用...
《Visual C#基于组件的开发》是一份深入探讨C#组件开发技术的宝贵资源,它涵盖了从基础到高级的各种主题,旨在帮助开发者更好地理解和实践组件编程。这份资料被分为三个部分,每个部分由一系列PDG文件组成,这些文件...
而现在组件化之后,某个业务组件只需要 10s~20s 左右。在依赖 二进制化组件的情况下,业务组件编译速度一般低于 10s。 • 分工更为明确,从而提升开发效率。 • 灵活,耦合低。 • 结合 MVVM。非常细致的单元测试,...
这个“COM组件教程&源代码”资源显然是为初学者设计的,旨在通过详细的文字说明和图像指导,帮助学习者理解并实践COM组件的开发。 COM组件的核心概念包括: 1. **组件**: COM组件是实现了COM接口的二进制模块,...
总的来说,这个资源包是学习和实践COM组件、ATL和MFC的好材料,涵盖了从基础组件开发到高级应用的多个层面。通过这些项目,开发者可以深入理解COM的原理,掌握ATL和MFC的使用技巧,提升在Windows平台上构建组件和...