您的位置:首页 > 其它

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));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: