一、简介
熟悉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;
}