CodeFx:一站式微软开发技术解决方案 .

简介: 晚上在博客堂读完VSTO写的一篇文章,介绍了CodePlex上面的一个项目,叫做“All-In-One Code Framework”,代号CodeFx,简单的说,就是收集了几乎所有常见的微软开发技术的示例项目,将其打包到这个框架里,而且还使用各种不同的语言进行实现。
晚上在博客堂读完 VSTO 写的 一篇文章 ,介绍了 CodePlex 上面的一个项目,叫做 All-In-One Code Framework ,代号 CodeFx 简单的说 ,就是收集了几乎所有常见的微软开发技术的示例项目,将其打包到这个框架里,而且还使用各种不同的语言进行实现。比如创建一个 ActiveX 控件和 COM 组件, CodeFx 里面使用 ATL MFC VB C# 来实现同样的功能。

适合新手入门,也可以作为一份模板供经验丰富的开发者使用,可节省大量的时间。官方网站上给出了框架的基本结构,如下图所示:

COM组件和ActiveX控件示例

 

数据访问示例

库示例

进程间通信示例 

 

花了2个小时粗略阅读了代码,记录下学习心得:

1)先来说ActiveX这条线,它里面使用了ATL(这里有2种实现,进程内和进程外)MFC,C#,VB四种技术来实现。功能就是四点:一个返回字符串的HelloWorld方法,一个float类型的属性FloatProperty,一个返回进程号和线程号的GetProcessThreadID方法,一个FloatPropertyChanging事件。

2)授权支持是 ActiveX 控件的一项可选功能,它使您得以控制能使用或分发该控件的人。(请参见MFC ActiveX 控件:授权 ActiveX 控件》)。

头文件的修改     

“ActiveX 控件向导将下列代码放置在控件头文件中。声明了 factory 对象的两个成员函数,其中一个成员函数验证控件 .LIC 文件是否存在,而另一个成员函数则对包含该控件的应用程序中使用的许可证密钥进行检索:

    BEGIN_OLEFACTORY(CMFCActiveXCtrl)         //  Class factory and guid
         virtual  BOOL VerifyUserLicense();
        
virtual  BOOL GetLicenseKey(DWORD, BSTR FAR * );
    END_OLEFACTORY(CMFCActiveXCtrl)
 

实现文件的修改

“ActiveX 控件向导将下面两条语句放置在控件实现文件中,以声明许可文件名和许可字符串:

static  const  TCHAR BASED_CODE _szLicFileName[]  =  
   _T(
" License.lic " );
static  const  WCHAR BASED_CODE _szLicString[]  =
   L
" Copyright (c) 2000  " ;

注意:如果以任何方式修改 szLicString,则必须也修改控件 .LIC 文件的第一行,否则授权将无法正确运行。
“ActiveX 控件向导”将下列代码放置在控件实现文件中,以定义控件类的 VerifyUserLicense 函数和 GetLicenseKey 函数:

//  CMFCActiveXCtrl::CMFCActiveXCtrlFactory::VerifyUserLicense -
//  Checks for existence of a user license

BOOL CMFCActiveXCtrl::CMFCActiveXCtrlFactory::VerifyUserLicense()
{
    
return  AfxVerifyLicFile(AfxGetInstanceHandle(), _szLicFileName,
        _szLicString);
}

//  CMFCActiveXCtrl::CMFCActiveXCtrlFactory::GetLicenseKey -
//  Returns a runtime licensing key
BOOL CMFCActiveXCtrl::CMFCActiveXCtrlFactory::GetLicenseKey(DWORD dwReserved,
    BSTR FAR
*  pbstrKey)
{
    
if  (pbstrKey  ==  NULL)
        
return  FALSE;
    
* pbstrKey  =  SysAllocString(_szLicString);
    
return  ( * pbstrKey  !=  NULL);
}

最后,“ActiveX 控件向导修改控件项目 .IDL 文件。将关键字 licensed 添加到控件的 coclass 声明中,如下例所示:

    [ uuid(E389AD6C - 4FB6 - 47AF - B03A - A5A5C6B2B820), licensed,
      helpstring(
" MFCActiveX Control " ), control ]
    coclass MFCActiveX

  3)作者封装了一个方法AutoWrap来调用COM组件公开出来的属性或方法。

HRESULT AutoWrap( int  autoType, VARIANT  * pvResult, IDispatch  * pDisp, 
                 LPOLESTR ptName, 
int  cArgs
{
    
//  Begin variable-argument list
    va_list marker;
    va_start(marker, cArgs);
    
if  ( ! pDisp) 
    {
        _putts(_T(
" NULL IDispatch passed to AutoWrap() " ));
        _exit(
0 );
    }
    
//  Variables used
    DISPPARAMS dp  =  { NULL, NULL,  0 0  };
    DISPID dispidNamed 
=  DISPID_PROPERTYPUT;
    DISPID dispID;
    HRESULT hr;
    
char  szName[ 200 ];
    
    
//  Convert down to ANSI
    WideCharToMultiByte(CP_ACP,  0 , ptName,  - 1 , szName,  256 , NULL, NULL);
    
    
//  Get DISPID for name passed
    hr  =  pDisp -> GetIDsOfNames(IID_NULL,  & ptName,  1 , LOCALE_USER_DEFAULT,
        
& dispID);
    
if  (FAILED(hr))
    {
        _tprintf(_T(
            
" IDispatch::GetIDsOfNames(/ " % s/ " ) failed w/err 0x%08lx/n "
            ), szName, hr);
        
return  hr;
    }
    
    
//  Allocate memory for arguments
    VARIANT  * pArgs  =  new  VARIANT[cArgs + 1 ];
    
//  Extract arguments
     for ( int  i = 0 ; i < cArgs; i ++
    {
        pArgs[i] 
=  va_arg(marker, VARIANT);
    }
    
    
//  Build DISPPARAMS
    dp.cArgs  =  cArgs;
    dp.rgvarg 
=  pArgs;
    
    
//  Handle special-case for property-puts
     if  (autoType  &  DISPATCH_PROPERTYPUT)
    {
        dp.cNamedArgs 
=  1 ;
        dp.rgdispidNamedArgs 
=  & dispidNamed;
    }
    
    
//  Make the call
    hr  =  pDisp -> Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
        autoType, 
& dp, pvResult, NULL, NULL);
    
if  (FAILED(hr)) 
    {
        _tprintf(_T(
            
" IDispatch::Invoke(/ " % s/ " =%08lx) failed w/err 0x%08lx/n "
            ), szName, dispID, hr);
        
return  hr;
    }

    
//  End variable-argument section
    va_end(marker);
    
    delete[] pArgs;
    
    
return  hr;
}

4)DLL的延迟加载使得我们不需要使用LoadLibrary和GetProcAddress。这样的好处是直到程序调用DLL中的函数时才加载此DLL。

#include  < Delayimp.h >

  卸载延迟加载的DLL的代码:

    PCSTR pszDll  =  " CppDllExport.dll " ;
    _tprintf(_T(
" __FUnloadDelayLoadedDLL2 => %d/n " ),
    __FUnloadDelayLoadedDLL2(pszDll));

 

from:http://blog.csdn.net/phinecos/article/details/4611934

目录
相关文章
|
19天前
|
数据可视化 搜索推荐 小程序
LowCode:低代码平台,2024国内十大主流低代码平台年终盘点
低代码平台是一种加速软件开发的高效工具,通过可视化和模型驱动的方式减少手动编码,快速构建应用。它能显著提升开发效率,降低开发成本,支持企业快速实现数字化转型。国内主流低代码平台如织信Informat、白码、钉钉宜搭等,各具特色,可根据企业需求选择合适的平台。私有化部署更是确保数据安全和定制化的重要手段。
|
7月前
|
存储 小程序 Serverless
盘点:2024年国内较为主流的七大低代码开发平台!
低代码开发平台,可以让你在不需要专业工程师人员的情况下,快速使用零代码或无代码、低成本快速构建你的应用、接口、逻辑、业务和数据。以下是2024年整理的,国内较为主流的七大低代码开发平台!排名不分先后。
|
7月前
|
安全 开发工具 数据安全/隐私保护
云开发在教育应用开发的实践
云开发在教育应用开发的实践
|
运维 数据可视化 搜索推荐
盘点:2022年国内比较主流的低代码开发平台有哪些?
织信Informat是面向业务人员的低/零代码平台,具有高度灵活的“数据+权限+流程”动态信息管理模型,用户不需要依赖代码开发,可以通过自主配置的方式,快速搭建企业运营所需的各类管理系统,亮点是提供永久免费版试用。
|
Cloud Native 数据可视化 搜索推荐
2023年国内主流低代码平台介绍
2023年国内主流低代码平台介绍
299 0
|
项目管理
企业级研发管理工具 ONES 收购为知笔记,全面升级企业知识库产品
企业级研发管理工具 ONES 收购为知笔记,全面升级企业知识库产品
260 0
企业级研发管理工具 ONES 收购为知笔记,全面升级企业知识库产品
|
中间件 程序员 Linux
让开发变得更简单 | 阿里云中间件推出全新开发者服务
要码出未来,除了程序员专属的节日福利,还需要实打实的为程序员解决手头的难题。 10月24日,阿里云推出全新开发者服务,发布多款开发工具,包括Alibaba Cloud Toolkit 、链路追踪Tracing Analysis和应用高可用服务AHAS等,旨在帮助开发者们提高开发效率,降低运维复杂性。
2964 4
|
运维 数据可视化 Cloud Native
阿里巴巴专家教你如何在家安全高效开发软件
为响应国家号召,各“大厂”纷纷发出在家办公,延迟上班的通知,一时间“在线协同办公”成为热点。不同于大型集团公司,有足够财力和能力构建远程办公系统,中小企业既缺乏足够的预算又缺乏相应的经验。阿里云云效一直致力于成为数字企业的研发效能引擎,在这个特殊时期,我们希望可以将自己的经验和工具分享给中小企业,让他们在家也能安全高效地开发软件。
阿里巴巴专家教你如何在家安全高效开发软件
|
移动开发 测试技术 开发者
如何迅速开发一款移动App?蚂蚁金服移动开发平台mPaaS来帮你
小蚂蚁说: 时间倒推到两三年前,大家可能对刷支付宝乘公交车和地铁还感到惊奇。但如今,一个外来游客要是来到北上杭这些城市旅游的话,再也不用浪费时间在各个地铁票售卖处排长队买地铁票了。无论是用支付宝扫码进站,还是打开像上海地铁的“METRO大都会”这类App,这些应用的出现和存在最终都是为了方便消费者的日常出行体验。
4393 0
|
存储 移动开发 Java
阿里巴巴开源技术汇总:115个软件
云栖社区近期策划了多期和开源产品相关的内容,如GitHub最流行的开源机器学习、大数据等项目,揭秘阿里Weex项目,Hilo开源分析等。深入挖掘,发现开源中国已经收集了数年来阿里115个开源软件,特别分享,也征集大家对后续阿里开源技术选题的建议。
34278 0