CodeFx:一站式微软开发技术解决方案
2009-03-04 23:15
405 查看
晚上在博客堂读完VSTO写的一篇文章,介绍了CodePlex上面的一个项目,叫做“All-In-One Code Framework”,代号CodeFx,简单的说,就是收集了几乎所有常见的微软开发技术的示例项目,将其打包到这个框架里,而且还使用各种不同的语言进行实现。比如创建一个ActiveX控件和COM组件,CodeFx里面使用ATL、MFC、VB、C#来实现同样的功能。
适合新手入门,也可以作为一份模板供经验丰富的开发者使用,可节省大量的时间。官方网站上给出了框架的基本结构,如下图所示:
COM组件和ActiveX控件示例
)
{
// 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));
适合新手入门,也可以作为一份模板供经验丰富的开发者使用,可节省大量的时间。官方网站上给出了框架的基本结构,如下图所示:
COM组件和ActiveX控件示例
)
{
// 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));
相关文章推荐
- CodeFx: 微软一站式开发技术框架解决方案 2009-5-10 简介
- CodeFx:一站式微软开发技术解决方案
- CodeFx: 微软一站式开发技术框架解决方案 2009-7-30 新增sample code简介
- CodeFx: 微软一站式开发技术框架解决方案 2009-6-14 简介
- CodeFx:一站式微软开发技术解决方案
- CodeFx:一站式微软开发技术解决方案
- CodeFx:一站式微软开发技术解决方案 .
- CodeFx: 微软一站式开发技术框架解决方案 2009-4-11 简介
- 【强烈推荐】CodeFx:一站式微软开发技术框架解决方案——由微软内开发团队开发
- CodeFx: 微软一站式开发技术框架解决方案 2009-4-27 简介
- 微软一站式开发技术框架解决方案 中文说明
- All-In-One Code Framework: 微软一站式开发技术框架解决方案 2009-6-14 新增sample code简介
- 微软一站式开发技术框架解决方案 中文说明
- 微软一站式开发技术框架解决方案 中文说明
- All-In-One Code Framework: 微软一站式开发技术框架解决方案 2009-7-8 新增sample code简介
- 绝佳的编码实践与样例代码:微软一站式开发技术框架CodeFx
- 微软一站式开发技术框架解决方案 年内展望
- 微软一站式开发技术框架解决方案 中文说明
- All-In-One Code Framework: 微软一站式开发技术框架解决方案 2009-8-26 新增sample code简介
- All-In-One Code Framework: 微软一站式开发技术框架解决方案 2009-7-30 新增sample code简介