一、简单介绍

熟悉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. linux根据该文件夹的读取权限和权限运行差异

    假设你linux下使用ls.细心的你会发现居然夹有权限运行.例如: drwxrwxr-x 11 cl cl 4096  9 25 14:22 ./ drwxr-xr-x 49 cl cl 4096 1 ...

  2. 流动python - 什么是魔术方法(magic method)

    我们经常看到各种各样的方法已经被包围了由双下划线,例如__init__,他们是魔术方法. 魔术方法python语言预订好"协议",在不同情况下不同的魔术方法,是隐式调用.我们重写这 ...

  3. Discuz 楼主帖子采集

    try { ; i < ; i++) { var html = GetHtmls("http://bbs.fobshanghai.com/viewthread.php?tid=3885 ...

  4. 创建内向交货单 BBP_INB_DELIVERY_CREATE

    DATA:DEL_HEADER TYPE BBP_INBD_L. DATA:DEL_TAB TYPE TABLE OF BBP_INBD_D WITH HEADER LINE. DATA:DEL_RE ...

  5. atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 能够选择的模式: 表格模式,责任链模式 1 3 ...

  6. Play Modules Morphia 1.2.9a 之 Aggregation and Group aggregation

    聚合 和 分组聚合: PlayMorphia 它提供了基于开发人员models的友好接口 设想你定义了一个model.class Sales: @Entity public class Sales e ...

  7. JVM的参数详解(转)

    12年毕业到先在处理第一年外这几年纯属于打酱油,当初自学Java然后就出来找工作了,还有第一家面试就通过了挺幸运的 但之后的这段时间一直是处于吃老本的状态.最近心情真的很不好,各种黄老邪!一直处于堕落 ...

  8. Hibernate在关于一对多,多对一双向关联映射

    [Hibernate]之关于一对多,多对一双向关联映射 因为一对多.和多对一的双向关联映射基本上一样,所以这里就一起写下来! Annotations配置 @Entity @Table(name=&qu ...

  9. C#枚举数和迭代器

    大道至简,始终认为简洁是一门优秀的编程语言的一个必要条件.相对来说,C#是比较简洁的,也越来越简洁.在C#中,一个关键字或者语法糖在编译器层面为我们做了很多乏味的工作,可能实现的是一个设计模式,甚至是 ...

  10. epoll演示样本

    server参考是别人的代码 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include ...