一、简单介绍

熟悉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. 数据结构 - 双链表(C++)

    // ------DoublyLinkedList.h------ template <class T> class DNode { private: // 指向左.右结点的指针 DNod ...

  2. Spark SQL 源代码分析系列

    从决定写Spark SQL文章的源代码分析,到现在一个月的时间,一个又一个几乎相同的结束很快,在这里也做了一个综合指数,方便阅读,下面是读取顺序 :) 第一章 Spark SQL源代码分析之核心流程 ...

  3. NET中小型企业项目开发框架系列(一个)

    当时的前端,我们开发了基于Net一组结构sprint.NET+NHibernate+MVC+WCF+EasyUI等中小型企业级系统开发平台,如今把整个开发过程中的步步进展整理出来和大家分享,这个系列可 ...

  4. Vertica: 基于DBMS架构的列存储数据仓库

    介绍 Vertica(属于HP公司),是一个基于DBMS架构的数据库系统,适合读密集的分析型数据库应用,比方数据仓库,白皮书中全名称为VerticaAnalytic Database.从命名中也可以看 ...

  5. nginx随着passenger构造ruby on rails页

    1.备份nginx简介 cp /opt/nginx/html/nginx.conf /opt/nginx/html/nginx.conf.bak 2.编者nginx简介 server { listen ...

  6. android:ViewPager动画摘要

    动画节目: 我们可以用ViewPager的setPageTransformer办法,至ViewPager动画.示及效果: 1.CubeInTransformer 2.CubeOutTransforme ...

  7. Android 常规任务的高度【schedule】与【scheduleAtFixedRate】差额

    于android计划定期任务有两种方法 1.schedule 2.scheduleAtFixedRate 这两种方法的差别在于 首次调用时间(Date when)这个參数 <span style ...

  8. PHP实现协同程序

    于server其中编程.为了实现异步.通常情况下,需要回调.比例如下面的代码 function send($value) { $data = process($value); onReceive($d ...

  9. JEECG移动解决方案 - 针对移动应用的应用系统转换的中间件解决方案

     设想: 通过中间件配置,在业务系统中使用到移动应用程序的简单版本.(移动页面生成器) 实现方法: 当前移动应用解决方式非常多:app?html5?微信 採用何种方法来实现?对于一个企业来讲,app分 ...

  10. 【JDK源码分析】String的存储区与不可变性(转)

    // ... literals are interned by the compiler // and thus refer to the same object String s1 = " ...