替换弃用的atl属性

时间:2016-12-20 13:47:52

标签: atl visual-c++-2015

如何替换弃用的atl代码(Visual Studio 2015警告C4467)?
数据结构位于文件DataType.h

    struct SData4
    {
        SData4() { Init(); }
        ~SData4() { Delete(); }
        void Init();
        void Delete();
        LPWSTR m_strSomething; 
        [string] LPWSTR m_strCode; 
    };

IDL文件包含使用此结构的方法declerations,如下所示:

    // interface version 6.0
[
    object,
    uuid(...-.-.-.-.),
    helpstring("IData4 Interface"),
    pointer_default(unique)
]
interface IData4 : IUnknown
{
    [helpstring("method SetData")] HRESULT SetData([in] long lLen, [in, size_is(lLen)] SData4* s);
};

我不能得到的是,在同一个结构中有LPWSTR个定义没有[string]属性。它已经工作了十年:/微软帮助页面https://msdn.microsoft.com/en-gb/library/8tesw2eh.aspx表明

  

[string]表示必须将一维char,wchar_t,byte或等效数组或指向此类数组的指针视为字符串。

所以我必须找到一种方法告诉DCOM这个WCHAR *是一个字符串。但为什么以及如何?

好的,我在书中找到了一个指示" Inside Distributed COM"来自Guy和Henry Eddon。他们声明,[string]属性允许用户在不定义实际字符串长度的情况下发送字符串。如果省略该属性,则必须使用CoTaskMemAllocCoTaskMemFree实现此字符串的内存管理。

1 个答案:

答案 0 :(得分:2)

要替换[string]或其他ATL属性,通用解决方案是在项目设置中启用“扩展属性源”选项。然后,在构建代码时,您将拥有一个非属性C ++代码,其中属性处理器扩展了属性。检查扩展代码,您会看到哪些非归因代码与您最初的代码相对应。