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

本文介绍了一个名为“All-In-One Code Framework”的项目,简称CodeFx,它集合了多种微软开发技术的示例项目,并提供了多种语言的实现版本。文章重点分析了框架中ActiveX控件和COM组件的实现细节,包括授权支持的实现方式以及DLL延迟加载等技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

晚上在博客堂读完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 文件是否存在,而另一个成员函数则对包含该控件的应用程序中使用的许可证密钥进行检索:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> BEGIN_OLEFACTORY(CMFCActiveXCtrl) // Classfactoryandguid
virtual BOOLVerifyUserLicense();
virtual BOOLGetLicenseKey(DWORD,BSTRFAR * );
END_OLEFACTORY(CMFCActiveXCtrl)

实现文件的修改

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> static const TCHARBASED_CODE_szLicFileName[] =
_T(
" License.lic " );
static const WCHARBASED_CODE_szLicString[] =
L
" Copyright(c)2000 " ;

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> // CMFCActiveXCtrl::CMFCActiveXCtrlFactory::VerifyUserLicense-
// Checksforexistenceofauserlicense

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

// CMFCActiveXCtrl::CMFCActiveXCtrlFactory::GetLicenseKey-
// Returnsaruntimelicensingkey
BOOLCMFCActiveXCtrl::CMFCActiveXCtrlFactory::GetLicenseKey(DWORDdwReserved,
BSTRFAR
* pbstrKey)
{
if (pbstrKey == NULL)
return FALSE;
* pbstrKey = SysAllocString(_szLicString);
return ( * pbstrKey != NULL);
}

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> [uuid(E389AD6C - 4FB6 - 47AF - B03A - A5A5C6B2B820),licensed,
helpstring(
" MFCActiveXControl " ),control]
coclassMFCActiveX

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> HRESULTAutoWrap( int autoType,VARIANT * pvResult,IDispatch * pDisp,
LPOLESTRptName,
int cArgs)
{
// Beginvariable-argumentlist
va_listmarker;
va_start(marker,cArgs);
if ( ! pDisp)
{
_putts(_T(
" NULLIDispatchpassedtoAutoWrap() " ));
_exit(
0 );
}
// Variablesused
DISPPARAMSdp = {NULL,NULL, 0 , 0 };
DISPIDdispidNamed
= DISPID_PROPERTYPUT;
DISPIDdispID;
HRESULThr;
char szName[ 200 ];

// ConvertdowntoANSI
WideCharToMultiByte(CP_ACP, 0 ,ptName, - 1 ,szName, 256 ,NULL,NULL);

// GetDISPIDfornamepassed
hr = pDisp -> GetIDsOfNames(IID_NULL, & ptName, 1 ,LOCALE_USER_DEFAULT,
& dispID);
if (FAILED(hr))
{
_tprintf(_T(
" IDispatch::GetIDsOfNames(/ " % s/ " )failedw/err0x%08lx/n "
),szName,hr);
return hr;
}

// Allocatememoryforarguments
VARIANT * pArgs = new VARIANT[cArgs + 1 ];
// Extractarguments
for ( int i = 0 ;i < cArgs;i ++ )
{
pArgs[i]
= va_arg(marker,VARIANT);
}

// BuildDISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg
= pArgs;

// Handlespecial-caseforproperty-puts
if (autoType & DISPATCH_PROPERTYPUT)
{
dp.cNamedArgs
= 1 ;
dp.rgdispidNamedArgs
= & dispidNamed;
}

// Makethecall
hr = pDisp -> Invoke(dispID,IID_NULL,LOCALE_SYSTEM_DEFAULT,
autoType,
& dp,pvResult,NULL,NULL);
if (FAILED(hr))
{
_tprintf(_T(
" IDispatch::Invoke(/ " % s/ " =%08lx)failedw/err0x%08lx/n "
),szName,dispID,hr);
return hr;
}

// Endvariable-argumentsection
va_end(marker);

delete[]pArgs;

return hr;
}

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> #include < Delayimp.h >

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

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> PCSTRpszDll = " CppDllExport.dll " ;
_tprintf(_T(
" __FUnloadDelayLoadedDLL2=>%d/n " ),
__FUnloadDelayLoadedDLL2(pszDll));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值