一、简单介绍

熟悉CredentialProvider的同学应该知道,他为一个Com组件,于是,在这里的内存分配(字符串拷贝)的一系列操作就要依照con的标准来。

二、Com组件的内存分配和释放

COM提供的任务内存分配器,通过IMalloc接口调用。此接口由CoGetMalloc返回。分配内存能够使用IMalloc::Alloc,释放可由IMalloc::Free完毕。

为了简化COM库封装了3个API函数来用于内存的分配和释放,例如以下:

void *CoTaskMemAlloc(ULONG cb);

void CoTaskMemFree(void *pv);

void CoTaskMemRealloc(void *pv, ULONGcb);

三个函数的含义与C语言的malloc,relloc和free函数类似,分别用于内存分配、又一次分配和释放内存的操作。

比如:

WORD length = MAX_LENGTH;

HRESULT hr;

psz = CoTaskMemAlloc( length );

if( psz  == NULL)

{

//return failure

}

..........

pszText = psz;

注意:在不使用的时候,一定要调用CoTaskMemFree函数释放分配的内存。

三 、应用

再介绍1个API函数:

SHStrDupW( LPCTSTR pszSource,LPTSTR *ppwsz);

含义:Makes a copy of a string in newly allocated memory 详细见:http://technet.microsoft.com/zh-cn/bb759924(v=vs.71).aspx

当中參数 ppwsz 的注解为

A pointer to an allocated Unicode string that contains the result. SHStrDup allocates
memory for this string with CoTaskMemAlloc.
You should free the string with CoTaskMemFree when
it is no longer needed.

意思就是说:SHStrDup 返回一个拷贝后的Unicode
字符串指针,函数内部使用CoTaskMemAlloc分配内存,当我们不使用这个字符串以后应该释放掉。

比如:

//
Our credential doesn't have any settable strings.

HRESULT CUSBKeyCredential::SetStringValue(

__in DWORD dwFieldID, 

__in PCWSTR pwz      

)

{

HRESULT hr;



// Validate parameters.

if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) && 

(CPFT_EDIT_TEXT == _rgCredProvFieldDescriptors[dwFieldID].cpft || 

CPFT_PASSWORD_TEXT == _rgCredProvFieldDescriptors[dwFieldID].cpft)) 

{

PWSTR* ppwszStored = &_rgFieldStrings[dwFieldID];

CoTaskMemFree(*ppwszStored);

hr = SHStrDupW(pwz, ppwszStored);


}

else

{

hr = E_INVALIDARG;

}



return hr;

}

注意:SHStrDup ()属于Shlwapi.dll链接库中的函数,大家能够參考一下:http://blog.csdn.net/swenjing/article/details/5259457
的文章《Shlwapi介绍

Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题的更多相关文章

  1. C语言中的内存分配与释放

    C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...

  2. DLL函数中内存分配及释放的问题

    DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误 ...

  3. 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

    http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...

  4. C++内存分配与释放

    C++内存分配与释放 1. new 运算符 与 operator new一条 new 表达式语句( new Type; )中的 new 是指 new 运算符.operator new 是定义在 #in ...

  5. (转)C++ STL中的vector的内存分配与释放

    C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...

  6. C++学习011-常用内存分配及释放函数

    C++用有多种方法来分配及释放内存,下面是一些经常使用的内存分配及释放函数 现在我还是一个技术小白,一般用到也指示 new+delete 和 malloc和free 其他的也是在学习中看到,下面的文字 ...

  7. C/C++动态二维数组的内存分配和释放

    C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...

  8. vector的内存分配与释放

    1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...

  9. linx常用查看命令和内存分配及释放

    1.命令行 运行时间多久:uptime 查看时间日期: date:date  -s '2014-7-4 10:35:20' hwcloc 查看内存分配: top free:http://blog.cs ...

随机推荐

  1. Hosting WCF Service

    之前在博客几个实例DemoWCF服务寄宿到控制到应用程序中,这篇来总结一下,经常使用的几种宿主的方式. 1.Self-Hosting 一个WCF服务可以寄宿在控制台应用程序或者WinForms app ...

  2. c#中 uint--byte[]--char[]--string相互转换汇总

    原文:c#中 uint--byte[]--char[]--string相互转换汇总 在在做一些互操作的时候往往需要一些类型的相互转换,比如用c#访问win32api的时候往往需要向api中传入DWOR ...

  3. IT忍者神龟之使用 PowerDesigner

    1. 启动 PowerDesigner 新建物理数据模型 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdmlweWhk/font/5a6L5L2T/fon ...

  4. Notification和Activity交互

    概述 通知(Notification)就是程序在不影响用户操作的情况下,通过手机顶部弹出消息告诉用户的一种信息通知方式,而且能够通过下拉通知操作抽屉通知,实现Notification与活动.通知和服务 ...

  5. proxool数据库连接池配置

    proxool.xml构造 <?xml version="1.0" encoding="UTF-8"?> <something-else-en ...

  6. 【Android进阶】Application对象的详解

    1:Application是什么? Application和Activity,Service一样,是android框架的一个系统组件,当android程序启动时系统会创建一个 application对 ...

  7. Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)

    Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)  本篇博客介绍Cocos2d-x 3.2中Lua演示样例的音频測试.Cocos2d-x使用SimpleAudi ...

  8. 【Android小应用】强迫症头像生成器

    近期一段时间在微信朋友圈,在头像的右上角添加一个红底白字的数字,让非常多有强迫症的同学点个不停,深深佩服发明这样的头像的姑娘,太机智了.但它不能自己定义,这是硬伤.... 这是朋友圈里的效果图: 这个 ...

  9. ROADS+dijkstra的灵活运用+POJ

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10742   Accepted: 3949 Descriptio ...

  10. 对LevelDB的“升级版”存储引擎RocksDB的调研成果

    Google的leveldb是个非常优秀的存储引擎.但还是有一些不尽人意的地方,比方leveldb不支持多线程合并.对key范围查找的支持还非常easy,未做优化措施,等等.而Facebook的Roc ...