• Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题


    一、简单介绍

    熟悉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介绍








  • 相关阅读:
    10.20stark组件已经完工
    webpack3到webpack4
    app埋点
    postman使用
    phantomjs
    nodejieba中文分词
    爬虫--cheerio
    mysql命令(三)
    mysql学习(二)
    mysql安装登录
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4223647.html
Copyright © 2020-2023  润新知