1

我应该如何替换已弃用的 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 文件包含使用此结构的方法声明,如下所示:

    // 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 *是一个字符串。但为什么以及如何?

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

4

1 回答 1

2

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

于 2016-12-20T18:31:24.783 回答