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));


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/03/04/1403450.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
数据可视化 搜索推荐 小程序
LowCode:低代码平台,2024国内十大主流低代码平台年终盘点
低代码平台是一种加速软件开发的高效工具,通过可视化和模型驱动的方式减少手动编码,快速构建应用。它能显著提升开发效率,降低开发成本,支持企业快速实现数字化转型。国内主流低代码平台如织信Informat、白码、钉钉宜搭等,各具特色,可根据企业需求选择合适的平台。私有化部署更是确保数据安全和定制化的重要手段。
|
3月前
|
安全 数据挖掘 数据管理
盘点几款国产CRM:提升企业竞争力的利器
近年来,国产CRM系统在技术进步和本土化服务方面展现出独特优势,成为企业提升竞争力的重要工具。其特点包括:定制化服务满足多样化需求;本土化支持更懂中国市场;严格的数据安全保障;高性价比;快速响应的本地化服务。推荐的国产CRM系统有销售易CRM、纷享销客、白码CRM、悟空CRM、用友CRM、金蝶CRM、神州云动CRM、八百客CRM、销帮帮CRM和珍客CRM,各具特色,适合不同规模和行业企业选用。
|
7月前
|
人工智能 Oracle 数据可视化
低代码开发平台权威推荐:创新开发、领跑市场!
Gartner推荐的6款低代码平台包括Zoho Creator、Mendix、Oracle、Appian、Retool和Quickbase。Zoho Creator在低代码领域有显著地位,连续多年入选Gartner魔力象限,其特点是快速定制、灵活的定制能力、AI辅助、合规与安全以及丰富的报表功能。Mendix则是一站式低代码平台,强调可视化开发和数据集成,但学习曲线较陡。Oracle平台提供预构建组件,快速开发且支持可视化,但私有部署选项有限。Appian以拖拽式构建和流程自动化为亮点,但可能无法满足所有高度定制需求。Retool以其强大的组件库和主流服务集成吸引用户,
173 0
|
7月前
|
存储 小程序 Serverless
盘点:2024年国内较为主流的七大低代码开发平台!
低代码开发平台,可以让你在不需要专业工程师人员的情况下,快速使用零代码或无代码、低成本快速构建你的应用、接口、逻辑、业务和数据。以下是2024年整理的,国内较为主流的七大低代码开发平台!排名不分先后。
|
7月前
|
数据可视化 搜索推荐 数据管理
2023 年度国内低代码平台排名榜 (这 5 款低平台备受欢迎!)
2023 年度国内低代码平台排名榜 (这 5 款低平台备受欢迎!)
674 0
|
运维 数据可视化 搜索推荐
盘点:2022年国内比较主流的低代码开发平台有哪些?
织信Informat是面向业务人员的低/零代码平台,具有高度灵活的“数据+权限+流程”动态信息管理模型,用户不需要依赖代码开发,可以通过自主配置的方式,快速搭建企业运营所需的各类管理系统,亮点是提供永久免费版试用。
|
Cloud Native 数据可视化 搜索推荐
2023年国内主流低代码平台介绍
2023年国内主流低代码平台介绍
307 0
|
运维 数据可视化 搜索推荐
程序员的新型开发工具——低代码平台
程序员的新型开发工具——低代码平台
854 0
《阿里云一站式企业级移动应用研发服务 —EMAX详解》电子版地址
阿里云一站式企业级移动应用研发服务 —EMAX详解
105 0
《阿里云一站式企业级移动应用研发服务 —EMAX详解》电子版地址
|
运维 数据可视化 Cloud Native
阿里巴巴专家教你如何在家安全高效开发软件
为响应国家号召,各“大厂”纷纷发出在家办公,延迟上班的通知,一时间“在线协同办公”成为热点。不同于大型集团公司,有足够财力和能力构建远程办公系统,中小企业既缺乏足够的预算又缺乏相应的经验。阿里云云效一直致力于成为数字企业的研发效能引擎,在这个特殊时期,我们希望可以将自己的经验和工具分享给中小企业,让他们在家也能安全高效地开发软件。
阿里巴巴专家教你如何在家安全高效开发软件