博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题
阅读量:5784 次
发布时间:2019-06-18

本文共 1654 字,大约阅读时间需要 5 分钟。

一、简单介绍

熟悉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;
}

注意:链接库中的函数,大家能够參考一下:http://blog.csdn.net/swenjing/article/details/5259457 的文章《》

你可能感兴趣的文章
Node.js 2017企业用户调查结果发布
查看>>
“软”苹果水逆的一周:杂志服务崩溃,新机型遭泄露,芯片首架离职
查看>>
JAVA的优势就是劣势啊!
查看>>
ELK实战之logstash部署及基本语法
查看>>
帧中继环境下ospf的使用(点到点模式)
查看>>
BeanShell变量和方法的作用域
查看>>
LINUX下防恶意扫描软件PortSentry
查看>>
由数据库对sql的执行说JDBC的Statement和PreparedStatement
查看>>
springmvc+swagger2
查看>>
软件评测-信息安全-应用安全-资源控制-用户登录限制(上)
查看>>
我的友情链接
查看>>
Java Web Application 自架构 一 注解化配置
查看>>
如何 debug Proxy.pac文件
查看>>
Python 学习笔记 - 面向对象(特殊成员)
查看>>
Kubernetes 1.11 手动安装并启用ipvs
查看>>
Puppet 配置管理工具安装
查看>>
Bug多,也别乱来,别被Bug主导了开发
查看>>
sed 替换基础使用
查看>>
高性能的MySQL(5)创建高性能的索引一B-Tree索引
查看>>
oracle备份与恢复--rman
查看>>